compat-wireless-2010-03-10
authorGrazvydas Ignotas <notasas@gmail.com>
Mon, 19 Apr 2010 16:08:33 +0000 (19:08 +0300)
committerGrazvydas Ignotas <notasas@gmail.com>
Tue, 20 Apr 2010 13:06:38 +0000 (16:06 +0300)
780 files changed:
.gitignore [new file with mode: 0644]
COPYRIGHT [new file with mode: 0644]
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
compat-release [new file with mode: 0644]
compat/Makefile [new file with mode: 0644]
compat/compat-2.6.14.c [new file with mode: 0644]
compat/compat-2.6.18.c [new file with mode: 0644]
compat/compat-2.6.19.c [new file with mode: 0644]
compat/compat-2.6.21.c [new file with mode: 0644]
compat/compat-2.6.22.c [new file with mode: 0644]
compat/compat-2.6.23.c [new file with mode: 0644]
compat/compat-2.6.24.c [new file with mode: 0644]
compat/compat-2.6.25.c [new file with mode: 0644]
compat/compat-2.6.26.c [new file with mode: 0644]
compat/compat-2.6.27.c [new file with mode: 0644]
compat/compat-2.6.28.c [new file with mode: 0644]
compat/compat-2.6.29.c [new file with mode: 0644]
compat/compat-2.6.30.c [new file with mode: 0644]
compat/compat-2.6.31.c [new file with mode: 0644]
compat/compat-2.6.32.c [new file with mode: 0644]
compat/compat-2.6.33.c [new file with mode: 0644]
compat/compat_firmware_class.c [new file with mode: 0644]
compat/main.c [new file with mode: 0644]
compat/pm_qos_params.c [new file with mode: 0644]
compat/scripts/compat_firmware_install [new file with mode: 0755]
config.mk [new file with mode: 0644]
drivers/bluetooth/Makefile [new file with mode: 0644]
drivers/bluetooth/ath3k.c [new file with mode: 0644]
drivers/bluetooth/bcm203x.c [new file with mode: 0644]
drivers/bluetooth/bfusb.c [new file with mode: 0644]
drivers/bluetooth/bluecard_cs.c [new file with mode: 0644]
drivers/bluetooth/bpa10x.c [new file with mode: 0644]
drivers/bluetooth/bt3c_cs.c [new file with mode: 0644]
drivers/bluetooth/btmrvl_debugfs.c [new file with mode: 0644]
drivers/bluetooth/btmrvl_drv.h [new file with mode: 0644]
drivers/bluetooth/btmrvl_main.c [new file with mode: 0644]
drivers/bluetooth/btmrvl_sdio.c [new file with mode: 0644]
drivers/bluetooth/btmrvl_sdio.h [new file with mode: 0644]
drivers/bluetooth/btsdio.c [new file with mode: 0644]
drivers/bluetooth/btuart_cs.c [new file with mode: 0644]
drivers/bluetooth/btusb.c [new file with mode: 0644]
drivers/bluetooth/dtl1_cs.c [new file with mode: 0644]
drivers/bluetooth/hci_bcsp.c [new file with mode: 0644]
drivers/bluetooth/hci_h4.c [new file with mode: 0644]
drivers/bluetooth/hci_ldisc.c [new file with mode: 0644]
drivers/bluetooth/hci_ll.c [new file with mode: 0644]
drivers/bluetooth/hci_uart.h [new file with mode: 0644]
drivers/bluetooth/hci_vhci.c [new file with mode: 0644]
drivers/misc/eeprom/Makefile [new file with mode: 0644]
drivers/misc/eeprom/eeprom_93cx6.c [new file with mode: 0644]
drivers/net/Makefile [new file with mode: 0644]
drivers/net/atl1c/Makefile [new file with mode: 0644]
drivers/net/atl1c/atl1c.h [new file with mode: 0644]
drivers/net/atl1c/atl1c_ethtool.c [new file with mode: 0644]
drivers/net/atl1c/atl1c_hw.c [new file with mode: 0644]
drivers/net/atl1c/atl1c_hw.h [new file with mode: 0644]
drivers/net/atl1c/atl1c_main.c [new file with mode: 0644]
drivers/net/atl1e/Makefile [new file with mode: 0644]
drivers/net/atl1e/atl1e.h [new file with mode: 0644]
drivers/net/atl1e/atl1e_ethtool.c [new file with mode: 0644]
drivers/net/atl1e/atl1e_hw.c [new file with mode: 0644]
drivers/net/atl1e/atl1e_hw.h [new file with mode: 0644]
drivers/net/atl1e/atl1e_main.c [new file with mode: 0644]
drivers/net/atl1e/atl1e_param.c [new file with mode: 0644]
drivers/net/atlx/Makefile [new file with mode: 0644]
drivers/net/atlx/atl1.c [new file with mode: 0644]
drivers/net/atlx/atl1.h [new file with mode: 0644]
drivers/net/atlx/atl2.c [new file with mode: 0644]
drivers/net/atlx/atl2.h [new file with mode: 0644]
drivers/net/atlx/atlx.c [new file with mode: 0644]
drivers/net/atlx/atlx.h [new file with mode: 0644]
drivers/net/b44.c [new file with mode: 0644]
drivers/net/b44.h [new file with mode: 0644]
drivers/net/usb/Makefile [new file with mode: 0644]
drivers/net/usb/cdc_ether.c [new file with mode: 0644]
drivers/net/usb/rndis_host.c [new file with mode: 0644]
drivers/net/usb/usbnet.c [new file with mode: 0644]
drivers/net/wireless/Makefile [new file with mode: 0644]
drivers/net/wireless/adm8211.c [new file with mode: 0644]
drivers/net/wireless/adm8211.h [new file with mode: 0644]
drivers/net/wireless/at76c50x-usb.c [new file with mode: 0644]
drivers/net/wireless/at76c50x-usb.h [new file with mode: 0644]
drivers/net/wireless/ath/Makefile [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/Makefile [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/ar9170.h [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/cmd.c [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/cmd.h [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/eeprom.h [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/hw.h [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/led.c [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/mac.c [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/main.c [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/phy.c [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/usb.c [new file with mode: 0644]
drivers/net/wireless/ath/ar9170/usb.h [new file with mode: 0644]
drivers/net/wireless/ath/ath.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/Makefile [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/ath5k.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/attach.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/base.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/base.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/caps.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/debug.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/debug.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/desc.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/desc.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/dma.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/eeprom.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/eeprom.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/gpio.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/initvals.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/led.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/pcu.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/phy.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/qcu.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/reg.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/reset.c [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/rfbuffer.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/rfgain.h [new file with mode: 0644]
drivers/net/wireless/ath/ath5k/rfkill.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/Makefile [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/ahb.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/ani.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/ani.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/ath9k.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/beacon.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/btcoex.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/btcoex.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/calib.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/calib.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/common.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/common.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/debug.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/debug.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/eeprom.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/eeprom.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/eeprom_4k.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/eeprom_9287.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/eeprom_def.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/gpio.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/hw.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/hw.c.orig [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/hw.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/init.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/initvals.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/mac.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/mac.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/main.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/pci.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/phy.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/phy.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/rc.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/rc.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/recv.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/reg.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/virtual.c [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/xmit.c [new file with mode: 0644]
drivers/net/wireless/ath/debug.c [new file with mode: 0644]
drivers/net/wireless/ath/debug.h [new file with mode: 0644]
drivers/net/wireless/ath/hw.c [new file with mode: 0644]
drivers/net/wireless/ath/main.c [new file with mode: 0644]
drivers/net/wireless/ath/reg.h [new file with mode: 0644]
drivers/net/wireless/ath/regd.c [new file with mode: 0644]
drivers/net/wireless/ath/regd.h [new file with mode: 0644]
drivers/net/wireless/ath/regd_common.h [new file with mode: 0644]
drivers/net/wireless/b43/Makefile [new file with mode: 0644]
drivers/net/wireless/b43/b43.h [new file with mode: 0644]
drivers/net/wireless/b43/b43.h.orig [new file with mode: 0644]
drivers/net/wireless/b43/debugfs.c [new file with mode: 0644]
drivers/net/wireless/b43/debugfs.h [new file with mode: 0644]
drivers/net/wireless/b43/dma.c [new file with mode: 0644]
drivers/net/wireless/b43/dma.h [new file with mode: 0644]
drivers/net/wireless/b43/leds.c [new file with mode: 0644]
drivers/net/wireless/b43/leds.h [new file with mode: 0644]
drivers/net/wireless/b43/lo.c [new file with mode: 0644]
drivers/net/wireless/b43/lo.h [new file with mode: 0644]
drivers/net/wireless/b43/main.c [new file with mode: 0644]
drivers/net/wireless/b43/main.c.orig [new file with mode: 0644]
drivers/net/wireless/b43/main.h [new file with mode: 0644]
drivers/net/wireless/b43/pcmcia.c [new file with mode: 0644]
drivers/net/wireless/b43/pcmcia.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_a.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_a.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_common.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_common.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_g.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_g.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_lp.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_lp.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_n.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_n.h [new file with mode: 0644]
drivers/net/wireless/b43/pio.c [new file with mode: 0644]
drivers/net/wireless/b43/pio.h [new file with mode: 0644]
drivers/net/wireless/b43/rfkill.c [new file with mode: 0644]
drivers/net/wireless/b43/rfkill.h [new file with mode: 0644]
drivers/net/wireless/b43/sdio.c [new file with mode: 0644]
drivers/net/wireless/b43/sdio.h [new file with mode: 0644]
drivers/net/wireless/b43/sysfs.c [new file with mode: 0644]
drivers/net/wireless/b43/sysfs.h [new file with mode: 0644]
drivers/net/wireless/b43/tables.c [new file with mode: 0644]
drivers/net/wireless/b43/tables.h [new file with mode: 0644]
drivers/net/wireless/b43/tables_lpphy.c [new file with mode: 0644]
drivers/net/wireless/b43/tables_lpphy.h [new file with mode: 0644]
drivers/net/wireless/b43/tables_nphy.c [new file with mode: 0644]
drivers/net/wireless/b43/tables_nphy.h [new file with mode: 0644]
drivers/net/wireless/b43/wa.c [new file with mode: 0644]
drivers/net/wireless/b43/wa.h [new file with mode: 0644]
drivers/net/wireless/b43/xmit.c [new file with mode: 0644]
drivers/net/wireless/b43/xmit.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/Makefile [new file with mode: 0644]
drivers/net/wireless/b43legacy/b43legacy.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/debugfs.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/debugfs.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/dma.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/dma.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/ilt.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/ilt.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/leds.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/leds.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/main.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/main.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/phy.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/phy.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/pio.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/pio.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/radio.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/radio.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/rfkill.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/rfkill.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/sysfs.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/sysfs.h [new file with mode: 0644]
drivers/net/wireless/b43legacy/xmit.c [new file with mode: 0644]
drivers/net/wireless/b43legacy/xmit.h [new file with mode: 0644]
drivers/net/wireless/ipw2x00/Makefile [new file with mode: 0644]
drivers/net/wireless/ipw2x00/ipw2100.c [new file with mode: 0644]
drivers/net/wireless/ipw2x00/ipw2100.h [new file with mode: 0644]
drivers/net/wireless/ipw2x00/ipw2200.c [new file with mode: 0644]
drivers/net/wireless/ipw2x00/ipw2200.h [new file with mode: 0644]
drivers/net/wireless/ipw2x00/libipw.h [new file with mode: 0644]
drivers/net/wireless/ipw2x00/libipw_geo.c [new file with mode: 0644]
drivers/net/wireless/ipw2x00/libipw_module.c [new file with mode: 0644]
drivers/net/wireless/ipw2x00/libipw_rx.c [new file with mode: 0644]
drivers/net/wireless/ipw2x00/libipw_tx.c [new file with mode: 0644]
drivers/net/wireless/ipw2x00/libipw_wx.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/Makefile [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-1000.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-3945-fh.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-3945-hw.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-3945-led.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-3945-led.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-3945-rs.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-3945.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-3945.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-4965-hw.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-4965.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-5000-hw.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-5000.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-6000-hw.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-6000.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-agn-led.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-agn-led.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-agn-rs.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-agn-rs.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-agn.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-agn.c.orig [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-calib.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-calib.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-commands.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-core.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-core.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-csr.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-debug.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-debugfs.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-dev.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-devtrace.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-devtrace.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-eeprom.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-eeprom.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-fh.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-hcmd.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-helpers.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-io.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-led.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-led.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-power.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-power.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-prph.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-rx.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-scan.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-spectrum.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-sta.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-sta.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-tx.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl3945-base.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/Makefile [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/bus.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/cfg80211.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/cfg80211.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/commands.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/commands.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/debug.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/debugfs.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/eeprom.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/eeprom.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/fw.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/fw.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/hal.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/hal.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/iwm.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/lmac.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/main.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/netdev.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/rx.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/rx.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/sdio.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/sdio.h [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/tx.c [new file with mode: 0644]
drivers/net/wireless/iwmc3200wifi/umac.h [new file with mode: 0644]
drivers/net/wireless/libertas/Makefile [new file with mode: 0644]
drivers/net/wireless/libertas/assoc.c [new file with mode: 0644]
drivers/net/wireless/libertas/assoc.h [new file with mode: 0644]
drivers/net/wireless/libertas/cfg.c [new file with mode: 0644]
drivers/net/wireless/libertas/cfg.h [new file with mode: 0644]
drivers/net/wireless/libertas/cmd.c [new file with mode: 0644]
drivers/net/wireless/libertas/cmd.h [new file with mode: 0644]
drivers/net/wireless/libertas/cmdresp.c [new file with mode: 0644]
drivers/net/wireless/libertas/debugfs.c [new file with mode: 0644]
drivers/net/wireless/libertas/debugfs.h [new file with mode: 0644]
drivers/net/wireless/libertas/decl.h [new file with mode: 0644]
drivers/net/wireless/libertas/defs.h [new file with mode: 0644]
drivers/net/wireless/libertas/dev.h [new file with mode: 0644]
drivers/net/wireless/libertas/ethtool.c [new file with mode: 0644]
drivers/net/wireless/libertas/host.h [new file with mode: 0644]
drivers/net/wireless/libertas/if_cs.c [new file with mode: 0644]
drivers/net/wireless/libertas/if_sdio.c [new file with mode: 0644]
drivers/net/wireless/libertas/if_sdio.h [new file with mode: 0644]
drivers/net/wireless/libertas/if_spi.c [new file with mode: 0644]
drivers/net/wireless/libertas/if_spi.h [new file with mode: 0644]
drivers/net/wireless/libertas/if_usb.c [new file with mode: 0644]
drivers/net/wireless/libertas/if_usb.h [new file with mode: 0644]
drivers/net/wireless/libertas/main.c [new file with mode: 0644]
drivers/net/wireless/libertas/main.c.orig [new file with mode: 0644]
drivers/net/wireless/libertas/mesh.c [new file with mode: 0644]
drivers/net/wireless/libertas/mesh.h [new file with mode: 0644]
drivers/net/wireless/libertas/radiotap.h [new file with mode: 0644]
drivers/net/wireless/libertas/rx.c [new file with mode: 0644]
drivers/net/wireless/libertas/scan.c [new file with mode: 0644]
drivers/net/wireless/libertas/scan.h [new file with mode: 0644]
drivers/net/wireless/libertas/tx.c [new file with mode: 0644]
drivers/net/wireless/libertas/types.h [new file with mode: 0644]
drivers/net/wireless/libertas/wext.c [new file with mode: 0644]
drivers/net/wireless/libertas/wext.h [new file with mode: 0644]
drivers/net/wireless/libertas_tf/Makefile [new file with mode: 0644]
drivers/net/wireless/libertas_tf/cmd.c [new file with mode: 0644]
drivers/net/wireless/libertas_tf/if_usb.c [new file with mode: 0644]
drivers/net/wireless/libertas_tf/if_usb.h [new file with mode: 0644]
drivers/net/wireless/libertas_tf/libertas_tf.h [new file with mode: 0644]
drivers/net/wireless/libertas_tf/main.c [new file with mode: 0644]
drivers/net/wireless/mac80211_hwsim.c [new file with mode: 0644]
drivers/net/wireless/mwl8k.c [new file with mode: 0644]
drivers/net/wireless/p54/Makefile [new file with mode: 0644]
drivers/net/wireless/p54/eeprom.c [new file with mode: 0644]
drivers/net/wireless/p54/eeprom.h [new file with mode: 0644]
drivers/net/wireless/p54/fwio.c [new file with mode: 0644]
drivers/net/wireless/p54/led.c [new file with mode: 0644]
drivers/net/wireless/p54/lmac.h [new file with mode: 0644]
drivers/net/wireless/p54/main.c [new file with mode: 0644]
drivers/net/wireless/p54/net2280.h [new file with mode: 0644]
drivers/net/wireless/p54/p54.h [new file with mode: 0644]
drivers/net/wireless/p54/p54pci.c [new file with mode: 0644]
drivers/net/wireless/p54/p54pci.h [new file with mode: 0644]
drivers/net/wireless/p54/p54spi.c [new file with mode: 0644]
drivers/net/wireless/p54/p54spi.h [new file with mode: 0644]
drivers/net/wireless/p54/p54spi_eeprom.h [new file with mode: 0644]
drivers/net/wireless/p54/p54usb.c [new file with mode: 0644]
drivers/net/wireless/p54/p54usb.h [new file with mode: 0644]
drivers/net/wireless/p54/txrx.c [new file with mode: 0644]
drivers/net/wireless/rndis_wlan.c [new file with mode: 0644]
drivers/net/wireless/rndis_wlan.c.orig [new file with mode: 0644]
drivers/net/wireless/rt2x00/Makefile [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2400pci.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2400pci.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2500pci.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2500pci.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2500usb.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2500usb.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2800.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2800lib.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2800lib.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2800pci.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2800pci.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2800usb.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2800usb.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00config.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00crypto.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00debug.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00debug.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00dev.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00dump.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00firmware.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00ht.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00leds.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00leds.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00lib.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00link.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00mac.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00pci.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00pci.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00queue.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00queue.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00reg.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00soc.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00soc.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00usb.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00usb.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt61pci.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt61pci.h [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt73usb.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt73usb.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/Makefile [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_dev.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_grf5101.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_grf5101.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_max2820.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_max2820.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_rtl8225.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_rtl8225.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_sa2400.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8180_sa2400.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187_dev.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187_leds.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187_leds.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187_rfkill.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187_rfkill.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187_rtl8225.c [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl8187_rtl8225.h [new file with mode: 0644]
drivers/net/wireless/rtl818x/rtl818x.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/Makefile [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_acx.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_acx.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_boot.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_boot.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_cmd.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_cmd.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_debugfs.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_debugfs.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_event.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_event.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_init.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_init.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_io.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_io.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_main.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_ps.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_ps.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_reg.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_rx.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_rx.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_sdio.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_spi.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_spi.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_tx.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1251_tx.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_acx.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_acx.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_boot.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_boot.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_cmd.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_cmd.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_conf.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_debugfs.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_debugfs.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_event.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_event.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_init.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_init.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_io.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_io.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_main.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_ps.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_ps.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_reg.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_rx.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_rx.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_spi.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_spi.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_testmode.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_testmode.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_tx.c [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl1271_tx.h [new file with mode: 0644]
drivers/net/wireless/wl12xx/wl12xx_80211.h [new file with mode: 0644]
drivers/net/wireless/zd1211rw/Makefile [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_chip.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_chip.h [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_def.h [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_mac.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_mac.h [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_rf.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_rf.h [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_rf_al2230.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_rf_al7230b.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_rf_rf2959.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_rf_uw2453.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_usb.c [new file with mode: 0644]
drivers/net/wireless/zd1211rw/zd_usb.h [new file with mode: 0644]
drivers/ssb/Makefile [new file with mode: 0644]
drivers/ssb/b43_pci_bridge.c [new file with mode: 0644]
drivers/ssb/driver_chipcommon.c [new file with mode: 0644]
drivers/ssb/driver_chipcommon_pmu.c [new file with mode: 0644]
drivers/ssb/driver_extif.c [new file with mode: 0644]
drivers/ssb/driver_gige.c [new file with mode: 0644]
drivers/ssb/driver_mipscore.c [new file with mode: 0644]
drivers/ssb/driver_pcicore.c [new file with mode: 0644]
drivers/ssb/embedded.c [new file with mode: 0644]
drivers/ssb/main.c [new file with mode: 0644]
drivers/ssb/pci.c [new file with mode: 0644]
drivers/ssb/pcihost_wrapper.c [new file with mode: 0644]
drivers/ssb/pcmcia.c [new file with mode: 0644]
drivers/ssb/scan.c [new file with mode: 0644]
drivers/ssb/sdio.c [new file with mode: 0644]
drivers/ssb/sprom.c [new file with mode: 0644]
drivers/ssb/ssb_private.h [new file with mode: 0644]
enable-older-kernels/README [new file with mode: 0644]
enable-older-kernels/enable-2.6.21.patch [new file with mode: 0644]
enable-older-kernels/enable-2.6.22.patch [new file with mode: 0644]
enable-older-kernels/enable-2.6.23.patch [new file with mode: 0644]
enable-older-kernels/enable-2.6.24.patch [new file with mode: 0644]
git-describe [new file with mode: 0644]
include/linux/ath9k_platform.h [new file with mode: 0644]
include/linux/bitops.h [new file with mode: 0644]
include/linux/compat-2.6.14.h [new file with mode: 0644]
include/linux/compat-2.6.18.h [new file with mode: 0644]
include/linux/compat-2.6.19.h [new file with mode: 0644]
include/linux/compat-2.6.21.h [new file with mode: 0644]
include/linux/compat-2.6.22.h [new file with mode: 0644]
include/linux/compat-2.6.23.h [new file with mode: 0644]
include/linux/compat-2.6.24.h [new file with mode: 0644]
include/linux/compat-2.6.25.h [new file with mode: 0644]
include/linux/compat-2.6.26.h [new file with mode: 0644]
include/linux/compat-2.6.27.h [new file with mode: 0644]
include/linux/compat-2.6.28.h [new file with mode: 0644]
include/linux/compat-2.6.29.h [new file with mode: 0644]
include/linux/compat-2.6.30.h [new file with mode: 0644]
include/linux/compat-2.6.31.h [new file with mode: 0644]
include/linux/compat-2.6.32.h [new file with mode: 0644]
include/linux/compat-2.6.33.h [new file with mode: 0644]
include/linux/compat-2.6.34.h [new file with mode: 0644]
include/linux/compat-2.6.h [new file with mode: 0644]
include/linux/eeprom_93cx6.h [new file with mode: 0644]
include/linux/ieee80211.h [new file with mode: 0644]
include/linux/nl80211.h [new file with mode: 0644]
include/linux/pci_ids.h [new file with mode: 0644]
include/linux/pm_qos_params.h [new file with mode: 0644]
include/linux/rfkill_backport.h [new file with mode: 0644]
include/linux/spi/libertas_spi.h [new file with mode: 0644]
include/linux/spi/wl12xx.h [new file with mode: 0644]
include/linux/ssb/ssb.h [new file with mode: 0644]
include/linux/ssb/ssb_driver_chipcommon.h [new file with mode: 0644]
include/linux/ssb/ssb_driver_extif.h [new file with mode: 0644]
include/linux/ssb/ssb_driver_gige.h [new file with mode: 0644]
include/linux/ssb/ssb_driver_mips.h [new file with mode: 0644]
include/linux/ssb/ssb_driver_pci.h [new file with mode: 0644]
include/linux/ssb/ssb_embedded.h [new file with mode: 0644]
include/linux/ssb/ssb_regs.h [new file with mode: 0644]
include/linux/unaligned/access_ok.h [new file with mode: 0644]
include/linux/unaligned/be_byteshift.h [new file with mode: 0644]
include/linux/unaligned/be_memmove.h [new file with mode: 0644]
include/linux/unaligned/be_struct.h [new file with mode: 0644]
include/linux/unaligned/generic.h [new file with mode: 0644]
include/linux/unaligned/le_byteshift.h [new file with mode: 0644]
include/linux/unaligned/le_memmove.h [new file with mode: 0644]
include/linux/unaligned/le_struct.h [new file with mode: 0644]
include/linux/unaligned/memmove.h [new file with mode: 0644]
include/linux/unaligned/packed_struct.h [new file with mode: 0644]
include/linux/usb/rndis_host.h [new file with mode: 0644]
include/linux/usb/usbnet.h [new file with mode: 0644]
include/linux/wireless.h [new file with mode: 0644]
include/net/bluetooth/bluetooth.h [new file with mode: 0644]
include/net/bluetooth/hci.h [new file with mode: 0644]
include/net/bluetooth/hci_core.h [new file with mode: 0644]
include/net/bluetooth/l2cap.h [new file with mode: 0644]
include/net/bluetooth/rfcomm.h [new file with mode: 0644]
include/net/cfg80211.h [new file with mode: 0644]
include/net/ieee80211_radiotap.h [new file with mode: 0644]
include/net/lib80211.h [new file with mode: 0644]
include/net/mac80211.h [new file with mode: 0644]
include/net/regulatory.h [new file with mode: 0644]
include/net/wext.h [new file with mode: 0644]
linux-next-cherry-picks/README [new file with mode: 0644]
net/bluetooth/Makefile [new file with mode: 0644]
net/bluetooth/af_bluetooth.c [new file with mode: 0644]
net/bluetooth/bnep/Makefile [new file with mode: 0644]
net/bluetooth/bnep/bnep.h [new file with mode: 0644]
net/bluetooth/bnep/core.c [new file with mode: 0644]
net/bluetooth/bnep/netdev.c [new file with mode: 0644]
net/bluetooth/bnep/sock.c [new file with mode: 0644]
net/bluetooth/cmtp/Makefile [new file with mode: 0644]
net/bluetooth/cmtp/capi.c [new file with mode: 0644]
net/bluetooth/cmtp/cmtp.h [new file with mode: 0644]
net/bluetooth/cmtp/core.c [new file with mode: 0644]
net/bluetooth/cmtp/sock.c [new file with mode: 0644]
net/bluetooth/hci_conn.c [new file with mode: 0644]
net/bluetooth/hci_core.c [new file with mode: 0644]
net/bluetooth/hci_event.c [new file with mode: 0644]
net/bluetooth/hci_sock.c [new file with mode: 0644]
net/bluetooth/hci_sock.c.orig [new file with mode: 0644]
net/bluetooth/hci_sysfs.c [new file with mode: 0644]
net/bluetooth/hci_sysfs.c.orig [new file with mode: 0644]
net/bluetooth/hidp/Makefile [new file with mode: 0644]
net/bluetooth/hidp/core.c [new file with mode: 0644]
net/bluetooth/hidp/hidp.h [new file with mode: 0644]
net/bluetooth/hidp/sock.c [new file with mode: 0644]
net/bluetooth/l2cap.c [new file with mode: 0644]
net/bluetooth/lib.c [new file with mode: 0644]
net/bluetooth/rfcomm/Makefile [new file with mode: 0644]
net/bluetooth/rfcomm/core.c [new file with mode: 0644]
net/bluetooth/rfcomm/sock.c [new file with mode: 0644]
net/bluetooth/rfcomm/tty.c [new file with mode: 0644]
net/bluetooth/sco.c [new file with mode: 0644]
net/mac80211/Makefile [new file with mode: 0644]
net/mac80211/aes_ccm.c [new file with mode: 0644]
net/mac80211/aes_ccm.h [new file with mode: 0644]
net/mac80211/aes_cmac.c [new file with mode: 0644]
net/mac80211/aes_cmac.h [new file with mode: 0644]
net/mac80211/agg-rx.c [new file with mode: 0644]
net/mac80211/agg-tx.c [new file with mode: 0644]
net/mac80211/cfg.c [new file with mode: 0644]
net/mac80211/cfg.h [new file with mode: 0644]
net/mac80211/debugfs.c [new file with mode: 0644]
net/mac80211/debugfs.h [new file with mode: 0644]
net/mac80211/debugfs_key.c [new file with mode: 0644]
net/mac80211/debugfs_key.h [new file with mode: 0644]
net/mac80211/debugfs_netdev.c [new file with mode: 0644]
net/mac80211/debugfs_netdev.h [new file with mode: 0644]
net/mac80211/debugfs_sta.c [new file with mode: 0644]
net/mac80211/debugfs_sta.h [new file with mode: 0644]
net/mac80211/driver-ops.h [new file with mode: 0644]
net/mac80211/driver-trace.c [new file with mode: 0644]
net/mac80211/driver-trace.h [new file with mode: 0644]
net/mac80211/event.c [new file with mode: 0644]
net/mac80211/ht.c [new file with mode: 0644]
net/mac80211/ibss.c [new file with mode: 0644]
net/mac80211/ieee80211_i.h [new file with mode: 0644]
net/mac80211/iface.c [new file with mode: 0644]
net/mac80211/key.c [new file with mode: 0644]
net/mac80211/key.h [new file with mode: 0644]
net/mac80211/led.c [new file with mode: 0644]
net/mac80211/led.h [new file with mode: 0644]
net/mac80211/main.c [new file with mode: 0644]
net/mac80211/mesh.c [new file with mode: 0644]
net/mac80211/mesh.h [new file with mode: 0644]
net/mac80211/mesh_hwmp.c [new file with mode: 0644]
net/mac80211/mesh_pathtbl.c [new file with mode: 0644]
net/mac80211/mesh_plink.c [new file with mode: 0644]
net/mac80211/michael.c [new file with mode: 0644]
net/mac80211/michael.h [new file with mode: 0644]
net/mac80211/mlme.c [new file with mode: 0644]
net/mac80211/offchannel.c [new file with mode: 0644]
net/mac80211/pm.c [new file with mode: 0644]
net/mac80211/rate.c [new file with mode: 0644]
net/mac80211/rate.h [new file with mode: 0644]
net/mac80211/rc80211_minstrel.c [new file with mode: 0644]
net/mac80211/rc80211_minstrel.h [new file with mode: 0644]
net/mac80211/rc80211_minstrel_debugfs.c [new file with mode: 0644]
net/mac80211/rc80211_pid.h [new file with mode: 0644]
net/mac80211/rc80211_pid_algo.c [new file with mode: 0644]
net/mac80211/rc80211_pid_debugfs.c [new file with mode: 0644]
net/mac80211/rx.c [new file with mode: 0644]
net/mac80211/scan.c [new file with mode: 0644]
net/mac80211/spectmgmt.c [new file with mode: 0644]
net/mac80211/sta_info.c [new file with mode: 0644]
net/mac80211/sta_info.h [new file with mode: 0644]
net/mac80211/status.c [new file with mode: 0644]
net/mac80211/tkip.c [new file with mode: 0644]
net/mac80211/tkip.h [new file with mode: 0644]
net/mac80211/tx.c [new file with mode: 0644]
net/mac80211/util.c [new file with mode: 0644]
net/mac80211/wep.c [new file with mode: 0644]
net/mac80211/wep.h [new file with mode: 0644]
net/mac80211/wme.c [new file with mode: 0644]
net/mac80211/wme.h [new file with mode: 0644]
net/mac80211/work.c [new file with mode: 0644]
net/mac80211/wpa.c [new file with mode: 0644]
net/mac80211/wpa.h [new file with mode: 0644]
net/rfkill/Makefile [new file with mode: 0644]
net/rfkill/core.c [new file with mode: 0644]
net/rfkill/input.c [new file with mode: 0644]
net/rfkill/input.c.orig [new file with mode: 0644]
net/rfkill/rfkill.h [new file with mode: 0644]
net/wireless/Makefile [new file with mode: 0644]
net/wireless/chan.c [new file with mode: 0644]
net/wireless/core.c [new file with mode: 0644]
net/wireless/core.h [new file with mode: 0644]
net/wireless/debugfs.c [new file with mode: 0644]
net/wireless/debugfs.h [new file with mode: 0644]
net/wireless/ethtool.c [new file with mode: 0644]
net/wireless/ethtool.h [new file with mode: 0644]
net/wireless/ibss.c [new file with mode: 0644]
net/wireless/lib80211.c [new file with mode: 0644]
net/wireless/lib80211_crypt_ccmp.c [new file with mode: 0644]
net/wireless/lib80211_crypt_tkip.c [new file with mode: 0644]
net/wireless/lib80211_crypt_wep.c [new file with mode: 0644]
net/wireless/mlme.c [new file with mode: 0644]
net/wireless/nl80211.c [new file with mode: 0644]
net/wireless/nl80211.h [new file with mode: 0644]
net/wireless/radiotap.c [new file with mode: 0644]
net/wireless/reg.c [new file with mode: 0644]
net/wireless/reg.h [new file with mode: 0644]
net/wireless/regdb.h [new file with mode: 0644]
net/wireless/scan.c [new file with mode: 0644]
net/wireless/sme.c [new file with mode: 0644]
net/wireless/sysfs.c [new file with mode: 0644]
net/wireless/sysfs.h [new file with mode: 0644]
net/wireless/util.c [new file with mode: 0644]
net/wireless/wext-compat.c [new file with mode: 0644]
net/wireless/wext-compat.h [new file with mode: 0644]
net/wireless/wext-core.c [new file with mode: 0644]
net/wireless/wext-priv.c [new file with mode: 0644]
net/wireless/wext-proc.c [new file with mode: 0644]
net/wireless/wext-sme.c [new file with mode: 0644]
net/wireless/wext-spy.c [new file with mode: 0644]
patches/01-netdev.patch [new file with mode: 0644]
patches/02-ksize.patch [new file with mode: 0644]
patches/03-rfkill.patch [new file with mode: 0644]
patches/04-netns.patch [new file with mode: 0644]
patches/05-usb.patch [new file with mode: 0644]
patches/06-header-changes.patch [new file with mode: 0644]
patches/07-change-default-rate-alg.patch [new file with mode: 0644]
patches/08-rename-iwl4965-config.patch [new file with mode: 0644]
patches/09-threaded-irq.patch [new file with mode: 0644]
patches/10-add-wext-handlers-to-netdev.patch [new file with mode: 0644]
patches/11-dev-pm-ops.patch [new file with mode: 0644]
patches/12-iw_handler-changes.patch [new file with mode: 0644]
patches/13-trace.patch [new file with mode: 0644]
patches/14-device-type.patch [new file with mode: 0644]
patches/15-symbol-export-conflicts.patch [new file with mode: 0644]
patches/16-bluetooth.patch [new file with mode: 0644]
patches/17-netdev-queue.patch [new file with mode: 0644]
patches/18-rename-usb-net-symbols.patch [new file with mode: 0644]
patches/19-kfifo.patch [new file with mode: 0644]
patches/20-pcidev.patch [new file with mode: 0644]
patches/21-capi-proc_fops.patch [new file with mode: 0644]
patches/22-multiqueue.patch [new file with mode: 0644]
patches/98-add-compat-wireless.patch [new file with mode: 0644]
patches/99-change-makefiles.patch [new file with mode: 0644]
patches/README [new file with mode: 0644]
scripts/admin-clean.sh [new file with mode: 0755]
scripts/admin-refresh.sh [new file with mode: 0755]
scripts/admin-update.sh [new file with mode: 0755]
scripts/athenable [new file with mode: 0755]
scripts/athload [new file with mode: 0755]
scripts/b43enable [new file with mode: 0755]
scripts/b43load [new file with mode: 0755]
scripts/btload.sh [new file with mode: 0755]
scripts/btunload.sh [new file with mode: 0755]
scripts/check_config.sh [new file with mode: 0755]
scripts/check_depmod [new file with mode: 0755]
scripts/compress_modules [new file with mode: 0755]
scripts/driver-select [new file with mode: 0755]
scripts/gen-compat-autoconf.sh [new file with mode: 0755]
scripts/gen-stable-release.sh [new file with mode: 0755]
scripts/iwl-enable [new file with mode: 0755]
scripts/iwl-load [new file with mode: 0755]
scripts/load.sh [new file with mode: 0755]
scripts/madwifi-unload [new file with mode: 0755]
scripts/modlib.sh [new file with mode: 0755]
scripts/unload.sh [new file with mode: 0755]
scripts/update-initramfs [new file with mode: 0755]
scripts/wlload.sh [new file with mode: 0755]
scripts/wlunload.sh [new file with mode: 0755]
udev/50-compat_firmware.rules [new file with mode: 0644]
udev/compat_firmware.sh [new file with mode: 0755]
udev/ubuntu/50-compat_firmware.rules [new file with mode: 0644]
udev/ubuntu/compat_firmware.sh [new file with mode: 0755]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..8babafb
--- /dev/null
@@ -0,0 +1,14 @@
+*~
+master-tag
+.compat_autoconf*
+.config.md5
+.config.mk_md5sum.txt
+.tmp_versions
+Module.symvers
+module.order
+modules.order
+.pc
+compat_autoconf.h
+*.o
+*o.cmd
+*.mod.c
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644 (file)
index 0000000..ca442d3
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,356 @@
+
+   NOTE! This copyright does *not* cover user programs that use kernel
+ services by normal system calls - this is merely considered normal use
+ of the kernel, and does *not* fall under the heading of "derived work".
+ Also note that the GPL below is copyrighted by the Free Software
+ Foundation, but the instance of code that it refers to (the Linux
+ kernel) is copyrighted by me and others who actually wrote it.
+
+ Also note that the only valid version of the GPL as far as the kernel
+ is concerned is _this_ particular version of the license (ie v2, not
+ v2.2 or v3.x or whatever), unless explicitly otherwise stated.
+
+                       Linus Torvalds
+
+----------------------------------------
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, 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 Library 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.
+\f
+                   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.)
+\f
+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.
+\f
+  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.
+\f
+  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.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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.
+
+    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 St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..cacd35b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,356 @@
+export KMODDIR?=       updates
+KMODDIR_ARG:=   "INSTALL_MOD_DIR=$(KMODDIR)"
+ifneq ($(origin KLIB), undefined)
+KMODPATH_ARG:=  "INSTALL_MOD_PATH=$(KLIB)"
+else
+export KLIB:=          /lib/modules/$(shell uname -r)
+endif
+export KLIB_BUILD ?=   $(KLIB)/build
+# Sometimes not available in the path
+MODPROBE := /sbin/modprobe
+MADWIFI=$(shell $(MODPROBE) -l ath_pci)
+OLD_IWL=$(shell $(MODPROBE) -l iwl4965)
+
+DESTDIR?=
+
+ifneq ($(KERNELRELEASE),)
+
+NOSTDINC_FLAGS := -I$(M)/include/ -include $(M)/include/linux/compat-2.6.h $(CFLAGS)
+
+obj-y := compat/
+
+obj-$(CONFIG_COMPAT_RFKILL) += net/rfkill/
+
+ifeq ($(BT),)
+obj-$(CONFIG_COMPAT_WIRELESS) += net/wireless/ net/mac80211/
+obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += drivers/net/wireless/
+
+obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/
+
+obj-$(CONFIG_COMPAT_NETWORK_MODULES) += drivers/net/
+obj-$(CONFIG_COMPAT_VAR_MODULES) +=  drivers/ssb/ drivers/misc/eeprom/
+endif
+
+obj-$(CONFIG_COMPAT_BLUETOOTH) += net/bluetooth/
+obj-$(CONFIG_COMPAT_BLUETOOTH_MODULES) += drivers/bluetooth/
+
+else
+
+export PWD :=  $(shell pwd)
+
+# These exported as they are used by the scripts
+# to check config and compat autoconf
+export COMPAT_CONFIG=config.mk
+export CONFIG_CHECK=.$(COMPAT_CONFIG)_md5sum.txt
+export COMPAT_AUTOCONF=include/linux/compat_autoconf.h
+export CREL=$(shell cat $(PWD)/compat-release)
+export CREL_PRE:=.compat_autoconf_
+export CREL_CHECK:=$(CREL_PRE)$(CREL)
+
+include $(PWD)/$(COMPAT_CONFIG)
+
+all: modules
+
+modules: $(CREL_CHECK)
+       @./scripts/check_config.sh
+       $(MAKE) -C $(KLIB_BUILD) M=$(PWD) modules
+       @touch $@
+
+bt: $(CREL_CHECK)
+       @./scripts/check_config.sh
+       $(MAKE) -C $(KLIB_BUILD) M=$(PWD) BT=TRUE modules
+       @touch $@
+
+# With the above and this we make sure we generate a new compat autoconf per
+# new relase of compat-wireless-2.6 OR when the user updates the 
+# $(COMPAT_CONFIG) file
+$(CREL_CHECK):
+       @# Force to regenerate compat autoconf
+       @rm -f $(CONFIG_CHECK)
+       @./scripts/check_config.sh
+       @touch $@
+       @md5sum $(COMPAT_CONFIG) > $(CONFIG_CHECK)
+
+btinstall: btuninstall bt-install-modules
+
+bt-install-modules: bt
+       $(MAKE) -C $(KLIB_BUILD) M=$(PWD) $(KMODDIR_ARG) $(KMODPATH_ARG) BT=TRUE \
+               modules_install
+       @/sbin/depmod -ae
+       @echo
+       @echo "Currently detected bluetooth subsystem modules:"
+       @echo
+       @$(MODPROBE) -l sco
+       @$(MODPROBE) -l l2cap
+       @$(MODPROBE) -l hidp
+       @$(MODPROBE) -l rfcomm
+       @$(MODPROBE) -l bnep
+       @$(MODPROBE) -l btusb
+       @$(MODPROBE) -l bluetooth
+       @echo
+       @echo Now run:
+       @echo
+       @echo sudo make btunload:
+       @echo
+       @echo And the load the needed bluetooth modules. If unsure reboot.
+       @echo
+
+btuninstall:
+       @# New location, matches upstream
+       @rm -rf $(KLIB)/$(KMODDIR)/net/bluetooth/
+       @rm -rf $(KLIB)/$(KMODDIR)/drivers/bluetooth/
+       @# Lets only remove the stuff we are sure we are providing
+       @# on the misc directory.
+       @/sbin/depmod -ae
+       @echo
+       @echo "Your old bluetooth subsystem modules were left intact:"
+       @echo
+       @$(MODPROBE) -l sco
+       @$(MODPROBE) -l l2cap
+       @$(MODPROBE) -l hidp
+       @$(MODPROBE) -l rfcomm
+       @$(MODPROBE) -l bnep
+       @$(MODPROBE) -l btusb
+       @$(MODPROBE) -l bluetooth
+       @
+       @echo
+
+btclean:
+       make -C /lib/modules/$(shell uname -r)/build M=$(PWD) BT=TRUE clean
+       @rm -f $(CREL_PRE)*
+
+install: uninstall install-modules install-scripts
+
+install-modules: modules
+       $(MAKE) -C $(KLIB_BUILD) M=$(PWD) $(KMODDIR_ARG) $(KMODPATH_ARG) \
+               modules_install
+       @./scripts/update-initramfs
+
+install-scripts:
+       @# All the scripts we can use
+       @mkdir -p $(DESTDIR)/usr/lib/compat-wireless/
+       @install scripts/modlib.sh      $(DESTDIR)/usr/lib/compat-wireless/
+       @install scripts/madwifi-unload $(DESTDIR)/usr/sbin/
+       @# This is to allow switching between drivers without blacklisting
+       @install scripts/athenable      $(DESTDIR)/usr/sbin/
+       @install scripts/b43enable      $(DESTDIR)/usr/sbin/
+       @install scripts/iwl-enable     $(DESTDIR)/usr/sbin/
+       @install scripts/athload        $(DESTDIR)/usr/sbin/
+       @install scripts/b43load        $(DESTDIR)/usr/sbin/
+       @install scripts/iwl-load       $(DESTDIR)/usr/sbin/
+       @if [ ! -z "$(MADWIFI)" ] && [ -z "$(DESTDIR)" ]; then \
+               echo ;\
+               echo -n "Note: madwifi detected, we're going to disable it. "  ;\
+               echo "If you would like to enable it later you can run:"  ;\
+               echo "    sudo athenable madwifi"  ;\
+               echo ;\
+               echo Running athenable ath5k...;\
+               /usr/sbin/athenable ath5k ;\
+       fi
+       @if [ ! -z "$(OLD_IWL)" ] && [ -z "$(DESTDIR)" ]; then \
+               echo ;\
+               echo -n "Note: iwl4965 detected, we're going to disable it. "  ;\
+               echo "If you would like to enable it later you can run:"  ;\
+               echo "    sudo iwl-load iwl4965"  ;\
+               echo ;\
+               echo Running iwl-enable iwlagn...;\
+               /usr/sbin/iwl-enable iwlagn ;\
+       fi
+       @# If on distributions like Mandriva which like to
+       @# compress their modules this will find out and do
+       @# it for you. Reason is some old version of modutils
+       @# won't know mac80211.ko should be used instead of
+       @# mac80211.ko.gz
+       @./scripts/compress_modules
+       @# Mandrake doesn't have a depmod.d/ conf file to prefer
+       @# the updates/ dir which is what we use so we add one for it
+       @# (or any other distribution that doens't have this).
+       @./scripts/check_depmod
+       @# Udev stuff needed for the new compat_firmware_class.
+       @./compat/scripts/compat_firmware_install
+       @/sbin/depmod -a
+       @echo
+       @echo "Currently detected wireless subsystem modules:"
+       @echo 
+       @$(MODPROBE) -l mac80211
+       @$(MODPROBE) -l cfg80211
+       @$(MODPROBE) -l lib80211
+       @$(MODPROBE) -l adm8211
+       @$(MODPROBE) -l ar9170usb
+       @$(MODPROBE) -l at76c50x-usb
+       @$(MODPROBE) -l ath
+       @$(MODPROBE) -l ath5k
+       @$(MODPROBE) -l ath9k
+       @$(MODPROBE) -l b43
+       @$(MODPROBE) -l b43legacy
+       @$(MODPROBE) -l b44
+       @$(MODPROBE) -l cdc_ether
+       @$(MODPROBE) -l eeprom_93cx6
+       @$(MODPROBE) -l ipw2100
+       @$(MODPROBE) -l ipw2200
+       @$(MODPROBE) -l iwl3945
+       @$(MODPROBE) -l iwlagn
+       @$(MODPROBE) -l iwlcore
+       @$(MODPROBE) -l lib80211_crypt_ccmp
+       @$(MODPROBE) -l lib80211_crypt_tkip
+       @$(MODPROBE) -l lib80211_crypt_wep
+       @$(MODPROBE) -l libertas
+       @$(MODPROBE) -l libertas_cs
+       @$(MODPROBE) -l libertas_sdio
+       @$(MODPROBE) -l libertas_spi
+       @$(MODPROBE) -l libertas_tf
+       @$(MODPROBE) -l libertas_tf_usb
+       @$(MODPROBE) -l libipw
+       @$(MODPROBE) -l mac80211_hwsim
+       @$(MODPROBE) -l mwl8k
+       @$(MODPROBE) -l p54common
+       @$(MODPROBE) -l p54pci
+       @$(MODPROBE) -l p54spi
+       @$(MODPROBE) -l p54usb
+       @$(MODPROBE) -l rndis_host
+       @$(MODPROBE) -l rndis_wlan
+       @$(MODPROBE) -l rt2400pci
+       @$(MODPROBE) -l rt2500pci
+       @$(MODPROBE) -l rt2500usb
+       @$(MODPROBE) -l rt2x00lib
+       @$(MODPROBE) -l rt2x00pci
+       @$(MODPROBE) -l rt2x00usb
+       @$(MODPROBE) -l rt61pci
+       @$(MODPROBE) -l rt73usb
+       @$(MODPROBE) -l rtl8180
+       @$(MODPROBE) -l rtl8187
+       @$(MODPROBE) -l ssb
+       @$(MODPROBE) -l usb8xxx
+       @$(MODPROBE) -l usbnet
+       @$(MODPROBE) -l zd1211rw
+       @echo
+       @echo "Currently detected bluetooth subsystem modules:"
+       @echo
+       @$(MODPROBE) -l sco
+       @$(MODPROBE) -l l2cap
+       @$(MODPROBE) -l hidp
+       @$(MODPROBE) -l rfcomm
+       @$(MODPROBE) -l bnep
+       @$(MODPROBE) -l btusb
+       @$(MODPROBE) -l bluetooth
+       @echo 
+       @echo Now run:
+       @echo 
+       @echo sudo make unload to unload both wireless and bluetooth modules
+       @echo sudo make wlunload to unload wireless modules
+       @echo sudo make btunload to unload bluetooth modules
+       @echo
+       @echo And then load the wireless or bluetooth module you need. If unsure reboot.
+       @echo Alternatively use "sudo make load/wlload/btload" to load modules
+       @echo
+
+uninstall:
+       @# New location, matches upstream
+       @rm -rf $(KLIB)/$(KMODDIR)/net/mac80211/
+       @rm -rf $(KLIB)/$(KMODDIR)/net/rfkill/
+       @rm -rf $(KLIB)/$(KMODDIR)/net/wireless/
+       @rm -rf $(KLIB)/$(KMODDIR)/drivers/ssb/
+       @rm -rf $(KLIB)/$(KMODDIR)/drivers/net/usb/
+       @rm -rf $(KLIB)/$(KMODDIR)/drivers/net/wireless/
+       @# Lets only remove the stuff we are sure we are providing
+       @# on the misc directory.
+       @rm -f $(KLIB)/$(KMODDIR)/drivers/misc/eeprom/eeprom_93cx6.ko*
+       @rm -f $(KLIB)/$(KMODDIR)/drivers/misc/eeprom_93cx6.ko*
+       @rm -f $(KLIB)/$(KMODDIR)/drivers/net/b44.ko*
+       @/sbin/depmod -a
+       @echo
+       @echo "Your old wireless subsystem modules were left intact:"
+       @echo 
+       @$(MODPROBE) -l mac80211
+       @$(MODPROBE) -l cfg80211
+       @$(MODPROBE) -l lib80211
+       @$(MODPROBE) -l adm8211
+       @$(MODPROBE) -l ar9170usb
+       @$(MODPROBE) -l at76c50x-usb
+       @$(MODPROBE) -l ath
+       @$(MODPROBE) -l ath5k
+       @$(MODPROBE) -l ath9k
+       @$(MODPROBE) -l b43
+       @$(MODPROBE) -l b43legacy
+       @$(MODPROBE) -l b44
+       @$(MODPROBE) -l cdc_ether
+       @$(MODPROBE) -l eeprom_93cx6
+       @$(MODPROBE) -l ipw2100
+       @$(MODPROBE) -l ipw2200
+       @$(MODPROBE) -l iwl3945
+       @$(MODPROBE) -l iwlagn
+       @$(MODPROBE) -l iwlcore
+       @$(MODPROBE) -l lib80211_crypt_ccmp
+       @$(MODPROBE) -l lib80211_crypt_tkip
+       @$(MODPROBE) -l lib80211_crypt_wep
+       @$(MODPROBE) -l libertas
+       @$(MODPROBE) -l libertas_cs
+       @$(MODPROBE) -l libertas_sdio
+       @$(MODPROBE) -l libertas_spi
+       @$(MODPROBE) -l libertas_tf
+       @$(MODPROBE) -l libertas_tf_usb
+       @$(MODPROBE) -l libipw
+       @$(MODPROBE) -l mac80211_hwsim
+       @$(MODPROBE) -l mwl8k
+       @$(MODPROBE) -l p54common
+       @$(MODPROBE) -l p54pci
+       @$(MODPROBE) -l p54spi
+       @$(MODPROBE) -l p54usb
+       @$(MODPROBE) -l rndis_host
+       @$(MODPROBE) -l rndis_wlan
+       @$(MODPROBE) -l rt2400pci
+       @$(MODPROBE) -l rt2500pci
+       @$(MODPROBE) -l rt2500usb
+       @$(MODPROBE) -l rt2x00lib
+       @$(MODPROBE) -l rt2x00pci
+       @$(MODPROBE) -l rt2x00usb
+       @$(MODPROBE) -l rt61pci
+       @$(MODPROBE) -l rt73usb
+       @$(MODPROBE) -l rtl8180
+       @$(MODPROBE) -l rtl8187
+       @$(MODPROBE) -l ssb
+       @$(MODPROBE) -l usb8xxx
+       @$(MODPROBE) -l usbnet
+       @$(MODPROBE) -l zd1211rw
+       @echo
+       @echo "Your old bluetooth subsystem modules were left intact:"
+       @echo
+       @$(MODPROBE) -l sco
+       @$(MODPROBE) -l l2cap
+       @$(MODPROBE) -l hidp
+       @$(MODPROBE) -l rfcomm
+       @$(MODPROBE) -l bnep
+       @$(MODPROBE) -l btusb
+       @$(MODPROBE) -l bluetooth
+       @
+       @echo 
+
+clean:
+       @if [ -d net -a -d $(KLIB_BUILD) ]; then \
+               $(MAKE) -C $(KLIB_BUILD) M=$(PWD) clean ;\
+       fi
+       @rm -f $(CREL_PRE)*
+unload:
+       @./scripts/unload.sh
+
+load: unload
+       @./scripts/load.sh
+
+btunload:
+       @./scripts/btunload.sh
+
+btload: btunload
+       @./scripts/btload.sh
+
+wlunload:
+       @./scripts/wlunload.sh
+
+wlload: wlunload
+       @./scripts/wlload.sh
+
+.PHONY: all clean install uninstall unload load btunload btload wlunload wlload modules bt
+
+endif
+
+clean-files += Module.symvers Module.markers modules modules.order
+clean-files += $(CREL_CHECK) $(CONFIG_CHECK)
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..88b16b4
--- /dev/null
+++ b/README
@@ -0,0 +1,248 @@
+
+Linux Wireless compatibility package
+=====================================
+
+This is a Linux wireless compatibility package which provides the latest
+Linux wireless subsystem enhancements for kernels 2.6.25 and above.
+It is technically possible to support kernels < 2.6.25 but more
+work is required for that.
+It also provides Linux bluetooth subsystem enhancements for kernels 2.6.27 and above.
+
+If you'd like to keep the wireless-testing git repository local as well,
+please read out git-guide which explains how to achieve this:
+
+http://wireless.kernel.org/en/developers/git-guide
+
+With a local git repository you can update the compatibility package yourself. 
+For more information on how to do this please refer the Developers section below.
+
+Documentation
+------------
+
+This package is also documented online and has more-up-to date
+information online than on this README file. You should read the wiki page
+and not rely on this README:
+
+http://wireless.kernel.org/en/users/Download
+
+Subscribe to the wiki page to get updates on the documentation.
+
+Where to get the latest
+-----------------------
+
+This package lets you build your own 'latest', all you need is a local git repository
+checkout of wireless-testing.git. However since not many users are expected to keep
+a local git repository of wireless-testing we provide daily snapshots of this
+package + the wireless subsystem code. You can find the latest snapshot at:
+
+http://wireless.kernel.org/en/users/Download
+
+Selecting your driver
+---------------------
+
+If you know the driver you want you can select it with our
+helper script:
+
+./scripts/driver-select
+
+Run that script to see more information.
+
+Building, and installing
+------------------------
+
+Build: build the latest linux wireless subsystem
+
+       make
+
+Install:
+
+We use the updates/ directory so your distribution's drivers are left intact.
+
+       sudo make install
+
+Uninstall:
+
+This nukes our changes to updates/ so you can go back to using your
+distribution's supported drivers.
+
+       sudo make uninstall
+
+Load:
+
+Reboot unless you know what you are doing.
+
+
+Bluetooth modules can be seperately compiled and installed using below commands
+
+Build:
+       make bt
+
+Install:
+       sudo make btinstall
+
+Uninstall:
+       sudo make btuninstall
+
+Load:
+       sudo make btload
+
+Unload:
+       sudo make btunload
+
+Drivers
+-------
+
+This is the list of drivers this package provides. It adds
+all new drivers or drivers which keep being updated which you might
+be interested in.
+
+Driver
+adm8211
+ath5k
+ath9h
+ar9170
+b43
+b43legacy
+iwl3945
+iwlagn
+ipw2100
+ipw2200
+libertas_cs (Libertas)
+ub8xxx      (Libertas)
+p54pci
+p54usb
+rt2400pci (rt2x00)
+rt2500pci (rt2x00)
+rt2500usb (rt2x00)
+rt61pci          (rt2x00)
+rt73usb          (rt2x00)
+rtl8180        (Realtek)
+rtl8187        (Realtek)
+zd1211rw
+
+This package also provides more drivers which may be documented here
+
+For a complete list see:
+
+http://wireless.kernel.org/en/users/Download
+
+Non-wireless drivers
+--------------------
+
+To support b43 ssb is also provided, and since ssb is also provided
+we provide b44 (the ethernet driverl).
+
+The new rfkill drivers also provided and backported.
+
+Bluetooth drivers:
+bluetooth
+btusb
+hci_uart
+btsdio
+btuart_cs
+bluecard_cs
+bfusb
+
+Firmware:
+---------
+
+If your driver needs firmware please be sure to check the driver page
+for that driver here:
+
+http://wireless.kernel.org/en/users/Drivers
+
+Why?
+----
+
+For users or developers stuck on older kernels that want to help test or 
+patch wireless work. Additionally if you're on a recent kernel this lets
+you get the latest and greatest wireless-testing git work without much effort.
+This may mean new drivers for some users. Last but not least we hope this
+will encourage vendors and developers to post patches upstream first
+rather than forking or maintaining their own mac80211 releases with
+their own patches for their own drivers.
+
+Building for external kernels
+----------------------------------
+
+If you have a kernel you do not have installed but yet want to build the
+compat-wireless-2.6 drivers for it you can use this syntax:
+
+make KLIB=/home/mcgrof/kernels/linux-2.6.23.9 KLIB_BUILD=/home/mcgrof/kernels/linux-2.6.23.9
+
+If you have a kernel installed, which is not your currently running kernel (e.g. via
+distro updates; plus its corresponding kernel-dev package), you can use this syntax:
+
+make  KLIB=/lib/modules/2.6.30.6-53.fc11.x86_64
+
+  and to install to your system's root path for the non-running kernel:
+
+make  KLIB=/lib/modules/2.6.30.6-53.fc11.x86_64 KMODPATH_ARG='INSTALL_MOD_PATH=' install
+
+Bugs
+-----
+
+If you've found a bug please report it to our linux-wireless mailing list:
+
+linux-wireless@vger.kernel.org
+
+Report the bug because you are working with the latest and greatest.
+If your bug is compatibility-related then we should still try to fix
+it within the compat.[ch] work.
+
+ChangeLog
+---------
+
+Here you see the list of changes to all wireless drivers, the wireless core and mac80211.
+
+http://git.kernel.org/?p=linux/kernel/git/linville/wireless-testing.git;a=log;
+
+This views all the changes on the 'everything' branch of wireless-testing.git.
+
+License
+-------
+
+This work is a subset of the Linux kernel as such we keep the kernel's
+Copyright practice. Some files have their own copyright and in those
+cases the license is mentioned in the file. All additional work made
+to building this package is licensed under the GPLv2.
+
+Developers
+----------
+
+Compatibility work goes into compat/compat.[ch]. If using those files do 
+not suffice additional actual code changes can go into compat/compat.diff.
+
+If you have your own wireless-testing git tree, before running admin-update.sh
+be sure to set your GIT_TREE variable. For example:
+
+export GIT_TREE=/home/mcgrof/wireless-testing/
+
+scripts/admin-clean.sh         - Cleans the compat-wireless-2.6 tree
+scripts/admin-update.sh                - Updates compat-wireless-2.6 with your git tree
+scripts/admin-refresh.sh       - Does the above two
+
+TODO
+----
+
+* Compatibilty work for 2.6.18 --> 2.6.21
+
+Patches for compatibility work
+------------------------------
+
+Please send patches against:
+
+git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/compat-wireless-2.6.git
+
+To: Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+CC: linux-wireless@vger.kernel.org
+Subject: [PATCH] compat-2.6: backport foo
+
+Patches for drivers
+-------------------
+
+If you'd like to send patches for a driver though you can send it using our 
+Submitting Patches guideline:
+
+http://wireless.kernel.org/en/developers/SubmittingPatches
+
diff --git a/compat-release b/compat-release
new file mode 100644 (file)
index 0000000..ba03d07
--- /dev/null
@@ -0,0 +1 @@
+next-20100225
diff --git a/compat/Makefile b/compat/Makefile
new file mode 100644 (file)
index 0000000..2005ff3
--- /dev/null
@@ -0,0 +1,28 @@
+obj-m += compat.o
+#compat-objs :=
+
+obj-$(CONFIG_COMPAT_FIRMWARE_CLASS) += compat_firmware_class.o
+
+compat-y += main.o
+
+# Compat kernel compatibility code
+compat-$(CONFIG_COMPAT_KERNEL_14) += compat-2.6.14.o
+compat-$(CONFIG_COMPAT_KERNEL_18) += compat-2.6.18.o
+compat-$(CONFIG_COMPAT_KERNEL_19) += compat-2.6.19.o
+compat-$(CONFIG_COMPAT_KERNEL_21) += compat-2.6.21.o
+compat-$(CONFIG_COMPAT_KERNEL_22) += compat-2.6.22.o
+compat-$(CONFIG_COMPAT_KERNEL_23) += compat-2.6.23.o
+compat-$(CONFIG_COMPAT_KERNEL_24) += compat-2.6.24.o
+
+compat-$(CONFIG_COMPAT_KERNEL_25) += \
+       compat-2.6.25.o \
+       pm_qos_params.o
+
+compat-$(CONFIG_COMPAT_KERNEL_26) += compat-2.6.26.o
+compat-$(CONFIG_COMPAT_KERNEL_27) += compat-2.6.27.o
+compat-$(CONFIG_COMPAT_KERNEL_28) += compat-2.6.28.o
+compat-$(CONFIG_COMPAT_KERNEL_29) += compat-2.6.29.o
+compat-$(CONFIG_COMPAT_KERNEL_30) += compat-2.6.30.o
+compat-$(CONFIG_COMPAT_KERNEL_31) += compat-2.6.31.o
+compat-$(CONFIG_COMPAT_KERNEL_32) += compat-2.6.32.o
+compat-$(CONFIG_COMPAT_KERNEL_33) += compat-2.6.33.o
diff --git a/compat/compat-2.6.14.c b/compat/compat-2.6.14.c
new file mode 100644 (file)
index 0000000..e0af181
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.14.
+ */
+
+#include <net/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14))
+
+/* 2.6.14 compat code goes here */
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) */
+
diff --git a/compat/compat-2.6.18.c b/compat/compat-2.6.18.c
new file mode 100644 (file)
index 0000000..c7fb2e4
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.18.
+ */
+
+#include <net/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
+
+/* 2.6.18 compat code goes here */
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) */
+
diff --git a/compat/compat-2.6.19.c b/compat/compat-2.6.19.c
new file mode 100644 (file)
index 0000000..fc75b64
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.19.
+ */
+
+#include <net/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
+
+/* 2.6.19 compat code goes here */
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) */
+
diff --git a/compat/compat-2.6.21.c b/compat/compat-2.6.21.c
new file mode 100644 (file)
index 0000000..e2737fb
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.21.
+ */
+
+#include <net/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
+
+/* 2.6.21 compat code goes here */
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21) */
+
diff --git a/compat/compat-2.6.22.c b/compat/compat-2.6.22.c
new file mode 100644 (file)
index 0000000..b1ff1f3
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.22.
+ */
+
+#include <net/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
+
+/* 2.6.22 compat code goes here */
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) */
+
diff --git a/compat/compat-2.6.23.c b/compat/compat-2.6.23.c
new file mode 100644 (file)
index 0000000..136d949
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.23.
+ */
+
+#include <net/compat.h>
+
+/* All things not in 2.6.22 */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23))
+
+/* On net/core/dev.c as of 2.6.24 */
+int __dev_addr_delete(struct dev_addr_list **list, int *count,
+                      void *addr, int alen, int glbl)
+{
+       struct dev_addr_list *da;
+
+       for (; (da = *list) != NULL; list = &da->next) {
+               if (memcmp(da->da_addr, addr, da->da_addrlen) == 0 &&
+                       alen == da->da_addrlen) {
+                       if (glbl) {
+                               int old_glbl = da->da_gusers;
+                               da->da_gusers = 0;
+                               if (old_glbl == 0)
+                                       break;
+                       }
+                       if (--da->da_users)
+                               return 0;
+
+                       *list = da->next;
+                       kfree(da);
+                       (*count)--;
+                       return 0;
+               }
+       }
+       return -ENOENT;
+}
+EXPORT_SYMBOL(__dev_addr_delete);
+
+/* On net/core/dev.c as of 2.6.24. This is not yet used by mac80211 but
+ * might as well add it */
+int __dev_addr_add(struct dev_addr_list **list, int *count,
+                   void *addr, int alen, int glbl)
+{
+       struct dev_addr_list *da;
+
+       for (da = *list; da != NULL; da = da->next) {
+               if (memcmp(da->da_addr, addr, da->da_addrlen) == 0 &&
+                       da->da_addrlen == alen) {
+                       if (glbl) {
+                               int old_glbl = da->da_gusers;
+                               da->da_gusers = 1;
+                               if (old_glbl)
+                                       return 0;
+                       }
+                       da->da_users++;
+                       return 0;
+               }
+       }
+
+       da = kmalloc(sizeof(*da), GFP_ATOMIC);
+       if (da == NULL)
+               return -ENOMEM;
+       memcpy(da->da_addr, addr, alen);
+       da->da_addrlen = alen;
+       da->da_users = 1;
+       da->da_gusers = glbl ? 1 : 0;
+       da->next = *list;
+       *list = da;
+       (*count)++;
+       return 0;
+}
+EXPORT_SYMBOL(__dev_addr_add);
+
+
+/* Part of net/core/dev_mcast.c as of 2.6.23. This is a slightly different version.
+ * Since da->da_synced is not part of 2.6.22 we need to take longer route when
+ * syncing */
+
+/**
+ *     dev_mc_sync     - Synchronize device's multicast list to another device
+ *     @to: destination device
+ *     @from: source device
+ *
+ *     Add newly added addresses to the destination device and release
+ *     addresses that have no users left. The source device must be
+ *     locked by netif_tx_lock_bh.
+ *
+ *     This function is intended to be called from the dev->set_multicast_list
+ *     function of layered software devices.
+ */
+int dev_mc_sync(struct net_device *to, struct net_device *from)
+{
+       struct dev_addr_list *da, *next, *da_to;
+       int err = 0;
+
+       netif_tx_lock_bh(to);
+       da = from->mc_list;
+       while (da != NULL) {
+               int synced = 0;
+               next = da->next;
+               da_to = to->mc_list;
+               /* 2.6.22 does not have da->da_synced so lets take the long route */
+               while (da_to != NULL) {
+                       if (memcmp(da_to->da_addr, da->da_addr, da_to->da_addrlen) == 0 &&
+                               da->da_addrlen == da_to->da_addrlen)
+                               synced = 1;
+                               break;
+               }
+               if (!synced) {
+                       err = __dev_addr_add(&to->mc_list, &to->mc_count,
+                                            da->da_addr, da->da_addrlen, 0);
+                       if (err < 0)
+                               break;
+                       da->da_users++;
+               } else if (da->da_users == 1) {
+                       __dev_addr_delete(&to->mc_list, &to->mc_count,
+                                         da->da_addr, da->da_addrlen, 0);
+                       __dev_addr_delete(&from->mc_list, &from->mc_count,
+                                         da->da_addr, da->da_addrlen, 0);
+               }
+               da = next;
+       }
+       if (!err)
+               __dev_set_rx_mode(to);
+       netif_tx_unlock_bh(to);
+
+       return err;
+}
+EXPORT_SYMBOL(dev_mc_sync);
+
+
+/* Part of net/core/dev_mcast.c as of 2.6.23. This is a slighty different version.
+ * Since da->da_synced is not part of 2.6.22 we need to take longer route when
+ * unsyncing */
+
+/**
+ *      dev_mc_unsync   - Remove synchronized addresses from the destination
+ *                       device
+ *     @to: destination device
+ *     @from: source device
+ *
+ *     Remove all addresses that were added to the destination device by
+ *     dev_mc_sync(). This function is intended to be called from the
+ *     dev->stop function of layered software devices.
+ */
+void dev_mc_unsync(struct net_device *to, struct net_device *from)
+{
+       struct dev_addr_list *da, *next, *da_to;
+
+       netif_tx_lock_bh(from);
+       netif_tx_lock_bh(to);
+
+       da = from->mc_list;
+       while (da != NULL) {
+               bool synced = false;
+               next = da->next;
+               da_to = to->mc_list;
+               /* 2.6.22 does not have da->da_synced so lets take the long route */
+               while (da_to != NULL) {
+                       if (memcmp(da_to->da_addr, da->da_addr, da_to->da_addrlen) == 0 &&
+                               da->da_addrlen == da_to->da_addrlen)
+                               synced = true;
+                               break;
+               }
+               if (!synced) {
+                       da = next;
+                       continue;
+               }
+               __dev_addr_delete(&to->mc_list, &to->mc_count,
+                       da->da_addr, da->da_addrlen, 0);
+               __dev_addr_delete(&from->mc_list, &from->mc_count,
+                       da->da_addr, da->da_addrlen, 0);
+               da = next;
+       }
+       __dev_set_rx_mode(to);
+
+       netif_tx_unlock_bh(to);
+       netif_tx_unlock_bh(from);
+}
+EXPORT_SYMBOL(dev_mc_unsync);
+
+/* Added as of 2.6.23 on net/core/dev.c. Slightly modifed, no dev->set_rx_mode on
+ * 2.6.22 so ignore that. */
+
+/*
+ *     Upload unicast and multicast address lists to device and
+ *     configure RX filtering. When the device doesn't support unicast
+ *     filtering it is put in promiscous mode while unicast addresses
+ *     are present.
+ */
+void __dev_set_rx_mode(struct net_device *dev)
+{
+       /* dev_open will call this function so the list will stay sane. */
+       if (!(dev->flags&IFF_UP))
+               return;
+
+       if (!netif_device_present(dev))
+               return;
+
+/* This needs to be ported to 2.6.22 framework */
+#if 0
+       /* Unicast addresses changes may only happen under the rtnl,
+        * therefore calling __dev_set_promiscuity here is safe.
+        */
+       if (dev->uc_count > 0 && !dev->uc_promisc) {
+               __dev_set_promiscuity(dev, 1);
+               dev->uc_promisc = 1;
+       } else if (dev->uc_count == 0 && dev->uc_promisc) {
+               __dev_set_promiscuity(dev, -1);
+               dev->uc_promisc = 0;
+       }
+#endif
+
+       if (dev->set_multicast_list)
+               dev->set_multicast_list(dev);
+}
+
+#ifndef HAVE_PCI_SET_MWI
+int pci_try_set_mwi(struct pci_dev *dev)
+{
+       return 0;
+}
+EXPORT_SYMBOL(pci_try_set_mwi);
+#else
+
+/**
+ * pci_try_set_mwi - enables memory-write-invalidate PCI transaction
+ * @dev: the PCI device for which MWI is enabled
+ *
+ * Enables the Memory-Write-Invalidate transaction in %PCI_COMMAND.
+ * Callers are not required to check the return value.
+ *
+ * RETURNS: An appropriate -ERRNO error value on error, or zero for success.
+ */
+int pci_try_set_mwi(struct pci_dev *dev)
+{
+       int rc = pci_set_mwi(dev);
+       return rc;
+}
+EXPORT_SYMBOL(pci_try_set_mwi);
+#endif
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) */
+
diff --git a/compat/compat-2.6.24.c b/compat/compat-2.6.24.c
new file mode 100644 (file)
index 0000000..31a9212
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.24.
+ */
+
+#include <net/compat.h>
+
+/* All things not in 2.6.22 and 2.6.23 */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+
+#include <net/arp.h>
+
+/*
+ * We simply won't use it though, just declare it for our wrappers and
+ * for usage with tons of code that makes mention to it.
+ */
+struct net init_net;
+EXPORT_SYMBOL(init_net);
+
+/* Part of net/ethernet/eth.c as of 2.6.24 */
+char *print_mac(char *buf, const u8 *addr)
+{
+       sprintf(buf, MAC_FMT,
+               addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
+       return buf;
+}
+EXPORT_SYMBOL(print_mac);
+
+/* 2.6.22 and 2.6.23 have eth_header_cache_update defined as extern in include/linux/etherdevice.h
+ * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
+
+/**
+ * eth_header_cache_update - update cache entry
+ * @hh: destination cache entry
+ * @dev: network device
+ * @haddr: new hardware address
+ *
+ * Called by Address Resolution module to notify changes in address.
+ */
+void eth_header_cache_update(struct hh_cache *hh,
+                             struct net_device *dev,
+                             unsigned char *haddr)
+{
+       memcpy(((u8 *) hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)),
+               haddr, ETH_ALEN);
+}
+EXPORT_SYMBOL(eth_header_cache_update);
+
+/* 2.6.22 and 2.6.23 have eth_header_cache defined as extern in include/linux/etherdevice.h
+ * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
+
+/**
+ * eth_header_cache - fill cache entry from neighbour
+ * @neigh: source neighbour
+ * @hh: destination cache entry
+ * Create an Ethernet header template from the neighbour.
+ */
+int eth_header_cache(struct neighbour *neigh, struct hh_cache *hh)
+{
+       __be16 type = hh->hh_type;
+       struct ethhdr *eth;
+       const struct net_device *dev = neigh->dev;
+
+       eth = (struct ethhdr *)
+           (((u8 *) hh->hh_data) + (HH_DATA_OFF(sizeof(*eth))));
+
+       if (type == htons(ETH_P_802_3))
+               return -1;
+
+       eth->h_proto = type;
+       memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
+       memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
+       hh->hh_len = ETH_HLEN;
+       return 0;
+}
+EXPORT_SYMBOL(eth_header_cache);
+
+/* 2.6.22 and 2.6.23 have eth_header() defined as extern in include/linux/etherdevice.h
+ * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
+
+/**
+ * eth_header - create the Ethernet header
+ * @skb:       buffer to alter
+ * @dev:       source device
+ * @type:      Ethernet type field
+ * @daddr: destination address (NULL leave destination address)
+ * @saddr: source address (NULL use device source address)
+ * @len:   packet length (<= skb->len)
+ *
+ *
+ * Set the protocol type. For a packet of type ETH_P_802_3 we put the length
+ * in here instead. It is up to the 802.2 layer to carry protocol information.
+ */
+int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
+              void *daddr, void *saddr, unsigned len)
+{
+       struct ethhdr *eth = (struct ethhdr *)skb_push(skb, ETH_HLEN);
+
+       if (type != ETH_P_802_3)
+               eth->h_proto = htons(type);
+       else
+               eth->h_proto = htons(len);
+
+       /*
+        *      Set the source hardware address.
+        */
+
+       if (!saddr)
+               saddr = dev->dev_addr;
+       memcpy(eth->h_source, saddr, dev->addr_len);
+
+       if (daddr) {
+               memcpy(eth->h_dest, daddr, dev->addr_len);
+               return ETH_HLEN;
+       }
+
+       /*
+        *      Anyway, the loopback-device should never use this function...
+        */
+
+       if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) {
+               memset(eth->h_dest, 0, dev->addr_len);
+               return ETH_HLEN;
+       }
+
+       return -ETH_HLEN;
+}
+
+EXPORT_SYMBOL(eth_header);
+
+/* 2.6.22 and 2.6.23 have eth_rebuild_header defined as extern in include/linux/etherdevice.h
+ * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
+
+/**
+ * eth_rebuild_header- rebuild the Ethernet MAC header.
+ * @skb: socket buffer to update
+ *
+ * This is called after an ARP or IPV6 ndisc it's resolution on this
+ * sk_buff. We now let protocol (ARP) fill in the other fields.
+ *
+ * This routine CANNOT use cached dst->neigh!
+ * Really, it is used only when dst->neigh is wrong.
+ */
+int eth_rebuild_header(struct sk_buff *skb)
+{
+       struct ethhdr *eth = (struct ethhdr *)skb->data;
+       struct net_device *dev = skb->dev;
+
+       switch (eth->h_proto) {
+#ifdef CONFIG_INET
+       case __constant_htons(ETH_P_IP):
+               return arp_find(eth->h_dest, skb);
+#endif
+       default:
+               printk(KERN_DEBUG
+                      "%s: unable to resolve type %X addresses.\n",
+                      dev->name, (int)eth->h_proto);
+
+               memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
+               break;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(eth_rebuild_header);
+
+/* 2.6.24 will introduce struct pci_dev is_pcie bit. To help
+ * with the compatibility code (compat.diff) being smaller, we provide a helper
+ * so in cases where that will be used we can simply slap ifdefs with this
+ * routine. Use compat_ prefex to not pollute namespace.  */
+int compat_is_pcie(struct pci_dev *pdev)
+{
+       int cap;
+       cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
+       return cap ? 1 : 0;
+}
+EXPORT_SYMBOL(compat_is_pcie);
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) */
+
diff --git a/compat/compat-2.6.25.c b/compat/compat-2.6.25.c
new file mode 100644 (file)
index 0000000..7546821
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2007-2010 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.25.
+ */
+
+/* All things not in 2.6.22, 2.6.23 and 2.6.24 */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25))
+
+#include <linux/miscdevice.h>
+
+/**
+ * The following things are out of ./lib/vsprintf.c
+ * The new iwlwifi driver is using them.
+ */
+
+/**
+ * strict_strtoul - convert a string to an unsigned long strictly
+ * @cp: The string to be converted
+ * @base: The number base to use
+ * @res: The converted result value
+ *
+ * strict_strtoul converts a string to an unsigned long only if the
+ * string is really an unsigned long string, any string containing
+ * any invalid char at the tail will be rejected and -EINVAL is returned,
+ * only a newline char at the tail is acceptible because people generally
+ * change a module parameter in the following way:
+ *
+ *     echo 1024 > /sys/module/e1000/parameters/copybreak
+ *
+ * echo will append a newline to the tail.
+ *
+ * It returns 0 if conversion is successful and *res is set to the converted
+ * value, otherwise it returns -EINVAL and *res is set to 0.
+ *
+ * simple_strtoul just ignores the successive invalid characters and
+ * return the converted value of prefix part of the string.
+ */
+int strict_strtoul(const char *cp, unsigned int base, unsigned long *res);
+
+/**
+ * strict_strtol - convert a string to a long strictly
+ * @cp: The string to be converted
+ * @base: The number base to use
+ * @res: The converted result value
+ *
+ * strict_strtol is similiar to strict_strtoul, but it allows the first
+ * character of a string is '-'.
+ *
+ * It returns 0 if conversion is successful and *res is set to the converted
+ * value, otherwise it returns -EINVAL and *res is set to 0.
+ */
+int strict_strtol(const char *cp, unsigned int base, long *res);
+
+#define define_strict_strtoux(type, valtype)                           \
+int strict_strtou##type(const char *cp, unsigned int base, valtype *res)\
+{                                                                      \
+       char *tail;                                                     \
+       valtype val;                                                    \
+       size_t len;                                                     \
+                                                                       \
+       *res = 0;                                                       \
+       len = strlen(cp);                                               \
+       if (len == 0)                                                   \
+               return -EINVAL;                                         \
+                                                                       \
+       val = simple_strtou##type(cp, &tail, base);                     \
+       if ((*tail == '\0') ||                                          \
+               ((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) {\
+               *res = val;                                             \
+               return 0;                                               \
+       }                                                               \
+                                                                       \
+       return -EINVAL;                                                 \
+}                                                                      \
+
+#define define_strict_strtox(type, valtype)                            \
+int strict_strto##type(const char *cp, unsigned int base, valtype *res)        \
+{                                                                      \
+       int ret;                                                        \
+       if (*cp == '-') {                                               \
+               ret = strict_strtou##type(cp+1, base, res);             \
+               if (!ret)                                               \
+                       *res = -(*res);                                 \
+       } else                                                          \
+               ret = strict_strtou##type(cp, base, res);               \
+                                                                       \
+       return ret;                                                     \
+}                                                                      \
+
+define_strict_strtoux(l, unsigned long)
+define_strict_strtox(l, long)
+
+EXPORT_SYMBOL(strict_strtoul);
+EXPORT_SYMBOL(strict_strtol);
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) */
+
diff --git a/compat/compat-2.6.26.c b/compat/compat-2.6.26.c
new file mode 100644 (file)
index 0000000..b9bf9e7
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2007-2010 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.26.
+ *
+ * Copyright holders from ported work:
+ *
+ * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org>
+ * Copyright (c) 2006-2007 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (c) 2006-2007 Novell Inc.
+ */
+
+#include <net/compat.h>
+
+/* All things not in 2.6.25 */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
+
+
+/* 2.6.24 does not have the struct kobject with a name */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
+
+/**
+ * kobject_set_name_vargs - Set the name of an kobject
+ * @kobj: struct kobject to set the name of
+ * @fmt: format string used to build the name
+ * @vargs: vargs to format the string.
+ */
+static
+int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
+                                 va_list vargs)
+{
+       const char *old_name = kobj->name;
+       char *s;
+
+       if (kobj->name && !fmt)
+               return 0;
+
+       kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
+       if (!kobj->name)
+               return -ENOMEM;
+
+       /* ewww... some of these buggers have '/' in the name ... */
+       while ((s = strchr(kobj->name, '/')))
+               s[0] = '!';
+
+       kfree(old_name);
+       return 0;
+}
+#else
+static
+int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
+                                 va_list vargs)
+{
+       struct device *dev;
+       unsigned int len;
+       va_list aq;
+
+       dev = container_of(kobj, struct device, kobj);
+
+       va_copy(aq, vargs);
+       len = vsnprintf(NULL, 0, fmt, aq);
+       va_end(aq);
+
+       len = len < BUS_ID_SIZE ? (len + 1) : BUS_ID_SIZE;
+
+       vsnprintf(dev->bus_id, len, fmt, vargs);
+       return 0;
+}
+#endif
+
+/**
+ * dev_set_name - set a device name
+ * @dev: device
+ * @fmt: format string for the device's name
+ */
+int dev_set_name(struct device *dev, const char *fmt, ...)
+{
+       va_list vargs;
+       int err;
+
+       va_start(vargs, fmt);
+       err = kobject_set_name_vargs(&dev->kobj, fmt, vargs);
+       va_end(vargs);
+       return err;
+}
+EXPORT_SYMBOL_GPL(dev_set_name);
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
+
diff --git a/compat/compat-2.6.27.c b/compat/compat-2.6.27.c
new file mode 100644 (file)
index 0000000..b78d465
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.27
+ */
+
+#include <linux/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
+
+#include <linux/pci.h>
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
+#include <linux/mmc/sdio.h>
+#include <linux/mmc/sdio_func.h>
+#include <linux/mmc/card.h>
+#include <linux/mmc/host.h>
+#endif
+
+/* rfkill notification chain */
+#define RFKILL_STATE_CHANGED            0x0001  /* state of a normal rfkill
+                                                       switch has changed */
+
+/*
+ * e5899e1b7d73e67de758a32174a859cc2586c0b9 made pci_pme_capable() external,
+ * it was defined internally, some drivers want access to this information.
+ *
+ * Unfortunately the old kernels do not have ->pm_cap or ->pme_support so
+ * we have to call the PCI routines directly.
+ */
+
+/**
+ * pci_pme_capable - check the capability of PCI device to generate PME#
+ * @dev: PCI device to handle.
+ * @state: PCI state from which device will issue PME#.
+ *
+ * This is the backport code for older kernels for compat-wireless, we read stuff
+ * from the initialization stuff from pci_pm_init().
+ */
+bool pci_pme_capable(struct pci_dev *dev, pci_power_t state)
+{
+       int pm;
+       u16 pmc = 0;
+       u16 pme_support; /* as from the pci dev */
+       /* find PCI PM capability in list */
+       pm = pci_find_capability(dev, PCI_CAP_ID_PM);
+       if (!pm)
+               return false;
+
+        if ((pmc & PCI_PM_CAP_VER_MASK) > 3) {
+               dev_err(&dev->dev, "unsupported PM cap regs version (%u)\n",
+                       pmc & PCI_PM_CAP_VER_MASK);
+               return false;
+        }
+
+       pmc &= PCI_PM_CAP_PME_MASK;
+
+       if (!pmc)
+               return false;
+
+       pme_support = pmc >> PCI_PM_CAP_PME_SHIFT;
+
+       /* Check device's ability to generate PME# */
+
+       return !!(pme_support & (1 << state));
+}
+EXPORT_SYMBOL(pci_pme_capable);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
+/**
+ *     mmc_align_data_size - pads a transfer size to a more optimal value
+ *     @card: the MMC card associated with the data transfer
+ *     @sz: original transfer size
+ *
+ *     Pads the original data size with a number of extra bytes in
+ *     order to avoid controller bugs and/or performance hits
+ *     (e.g. some controllers revert to PIO for certain sizes).
+ *
+ *     Returns the improved size, which might be unmodified.
+ *
+ *     Note that this function is only relevant when issuing a
+ *     single scatter gather entry.
+ */
+unsigned int mmc_align_data_size(struct mmc_card *card, unsigned int sz)
+{
+       /*
+       * FIXME: We don't have a system for the controller to tell
+       * the core about its problems yet, so for now we just 32-bit
+       * align the size.
+       */
+       sz = ((sz + 3) / 4) * 4;
+
+       return sz;
+}
+EXPORT_SYMBOL(mmc_align_data_size);
+
+/*
+ * Calculate the maximum byte mode transfer size
+ */
+static inline unsigned int sdio_max_byte_size(struct sdio_func *func)
+{
+       unsigned int mval = (unsigned int) min(func->card->host->max_seg_size,
+                           func->card->host->max_blk_size);
+       mval = min(mval, func->max_blksize);
+       return min(mval, 512u); /* maximum size for byte mode */
+}
+
+/**
+ *     sdio_align_size - pads a transfer size to a more optimal value
+ *     @func: SDIO function
+ *     @sz: original transfer size
+ *
+ *     Pads the original data size with a number of extra bytes in
+ *     order to avoid controller bugs and/or performance hits
+ *     (e.g. some controllers revert to PIO for certain sizes).
+ *
+ *     If possible, it will also adjust the size so that it can be
+ *     handled in just a single request.
+ *
+ *     Returns the improved size, which might be unmodified.
+ */
+unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz)
+{
+       unsigned int orig_sz;
+       unsigned int blk_sz, byte_sz;
+       unsigned chunk_sz;
+
+       orig_sz = sz;
+
+       /*
+        * Do a first check with the controller, in case it
+        * wants to increase the size up to a point where it
+        * might need more than one block.
+        */
+       sz = mmc_align_data_size(func->card, sz);
+
+       /*
+        * If we can still do this with just a byte transfer, then
+        * we're done.
+        */
+       if (sz <= sdio_max_byte_size(func))
+               return sz;
+
+       if (func->card->cccr.multi_block) {
+               /*
+                * Check if the transfer is already block aligned
+                */
+               if ((sz % func->cur_blksize) == 0)
+                       return sz;
+
+               /*
+                * Realign it so that it can be done with one request,
+                * and recheck if the controller still likes it.
+                */
+               blk_sz = ((sz + func->cur_blksize - 1) /
+                       func->cur_blksize) * func->cur_blksize;
+               blk_sz = mmc_align_data_size(func->card, blk_sz);
+
+               /*
+                * This value is only good if it is still just
+                * one request.
+                */
+               if ((blk_sz % func->cur_blksize) == 0)
+                       return blk_sz;
+
+               /*
+                * We failed to do one request, but at least try to
+                * pad the remainder properly.
+                */
+               byte_sz = mmc_align_data_size(func->card,
+                               sz % func->cur_blksize);
+               if (byte_sz <= sdio_max_byte_size(func)) {
+                       blk_sz = sz / func->cur_blksize;
+                       return blk_sz * func->cur_blksize + byte_sz;
+               }
+       } else {
+               /*
+                * We need multiple requests, so first check that the
+                * controller can handle the chunk size;
+                */
+               chunk_sz = mmc_align_data_size(func->card,
+                               sdio_max_byte_size(func));
+               if (chunk_sz == sdio_max_byte_size(func)) {
+                       /*
+                        * Fix up the size of the remainder (if any)
+                        */
+                       byte_sz = orig_sz % chunk_sz;
+                       if (byte_sz) {
+                               byte_sz = mmc_align_data_size(func->card,
+                                               byte_sz);
+                       }
+
+                       return (orig_sz / chunk_sz) * chunk_sz + byte_sz;
+               }
+       }
+
+       /*
+        * The controller is simply incapable of transferring the size
+        * we want in decent manner, so just return the original size.
+        */
+       return orig_sz;
+}
+EXPORT_SYMBOL_GPL(sdio_align_size);
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) */
+
+#ifdef CONFIG_DEBUG_FS
+/*
+ * Backport of debugfs_remove_recursive() without using the internals globals
+ * which are used by the kernel's version with:
+ * simple_release_fs(&debugfs_mount, &debugfs_mount_count);
+ */
+void debugfs_remove_recursive(struct dentry *dentry)
+{
+       struct dentry *last = NULL;
+
+       /* Sanity checks */
+       if (!dentry || !dentry->d_parent || !dentry->d_parent->d_inode)
+               return;
+
+       while (dentry != last) {
+               struct dentry *child = dentry;
+
+               /* Find a child without children */
+               while (!list_empty(&child->d_subdirs))
+                       child = list_entry(child->d_subdirs.next,
+                                          struct dentry,
+                                          d_u.d_child);
+
+               /* Bail out if we already tried to remove that entry */
+               if (child == last)
+                       return;
+
+               last = child;
+               debugfs_remove(child);
+       }
+}
+EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
+#endif /* CONFIG_DEBUG_FS */
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */
+
diff --git a/compat/compat-2.6.28.c b/compat/compat-2.6.28.c
new file mode 100644 (file)
index 0000000..115bd23
--- /dev/null
@@ -0,0 +1,373 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.28.
+ */
+
+#include <linux/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28))
+
+#include <linux/usb.h>
+
+/* 2.6.28 compat code goes here */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23))
+#if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)
+/*
+ * Compat-wireless notes for USB backport stuff:
+ *
+ * urb->reject exists on 2.6.27, the poison/unpoison helpers
+ * did not though. The anchor poison does not exist so we cannot use them.
+ *
+ * USB anchor poising seems to exist to prevent future driver sumbissions
+ * of usb_anchor_urb() to an anchor marked as poisoned. For older kernels
+ * we cannot use that, so new usb_anchor_urb()s will be anchored. The down
+ * side to this should be submission of URBs will continue being anchored
+ * on an anchor instead of having them being rejected immediately when the
+ * driver realized we needed to stop. For ar9170 we poison URBs upon the
+ * ar9170 mac80211 stop callback(), don't think this should be so bad.
+ * It mean there is period of time in older kernels for which we continue
+ * to anchor new URBs to a known stopped anchor. We have two anchors
+ * (TX, and RX)
+ */
+
+#if 0
+/**
+ * usb_poison_urb - reliably kill a transfer and prevent further use of an URB
+ * @urb: pointer to URB describing a previously submitted request,
+ *     may be NULL
+ *
+ * This routine cancels an in-progress request.  It is guaranteed that
+ * upon return all completion handlers will have finished and the URB
+ * will be totally idle and cannot be reused.  These features make
+ * this an ideal way to stop I/O in a disconnect() callback.
+ * If the request has not already finished or been unlinked
+ * the completion handler will see urb->status == -ENOENT.
+ *
+ * After and while the routine runs, attempts to resubmit the URB will fail
+ * with error -EPERM.  Thus even if the URB's completion handler always
+ * tries to resubmit, it will not succeed and the URB will become idle.
+ *
+ * This routine may not be used in an interrupt context (such as a bottom
+ * half or a completion handler), or when holding a spinlock, or in other
+ * situations where the caller can't schedule().
+ *
+ * This routine should not be called by a driver after its disconnect
+ * method has returned.
+ */
+void usb_poison_urb(struct urb *urb)
+{
+       might_sleep();
+       if (!(urb && urb->dev && urb->ep))
+               return;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
+       spin_lock_irq(&usb_reject_lock);
+#endif
+       ++urb->reject;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
+       spin_unlock_irq(&usb_reject_lock);
+#endif
+       /*
+        * XXX: usb_hcd_unlink_urb() needs backporting... this is defined
+        * on usb hcd.c but urb.c gets access to it. That is, older kernels
+        * have usb_hcd_unlink_urb() but its not exported, nor can we
+        * re-implement it exactly. This essentially dequeues the urb from
+        * hw, we need to figure out a way to backport this.
+        */
+       //usb_hcd_unlink_urb(urb, -ENOENT);
+
+       wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);
+}
+EXPORT_SYMBOL_GPL(usb_poison_urb);
+#endif
+#endif /* CONFIG_USB */
+
+#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
+
+#include <pcmcia/ds.h>
+struct pcmcia_cfg_mem {
+       tuple_t tuple;
+       cisparse_t parse;
+       u8 buf[256];
+       cistpl_cftable_entry_t dflt;
+};
+/**
+ * pcmcia_loop_config() - loop over configuration options
+ * @p_dev:     the struct pcmcia_device which we need to loop for.
+ * @conf_check:        function to call for each configuration option.
+ *             It gets passed the struct pcmcia_device, the CIS data
+ *             describing the configuration option, and private data
+ *             being passed to pcmcia_loop_config()
+ * @priv_data: private data to be passed to the conf_check function.
+ *
+ * pcmcia_loop_config() loops over all configuration options, and calls
+ * the driver-specific conf_check() for each one, checking whether
+ * it is a valid one. Returns 0 on success or errorcode otherwise.
+ */
+int pcmcia_loop_config(struct pcmcia_device *p_dev,
+                      int      (*conf_check)   (struct pcmcia_device *p_dev,
+                                                cistpl_cftable_entry_t *cfg,
+                                                cistpl_cftable_entry_t *dflt,
+                                                unsigned int vcc,
+                                                void *priv_data),
+                      void *priv_data)
+{
+       struct pcmcia_cfg_mem *cfg_mem;
+
+       tuple_t *tuple;
+       int ret;
+       unsigned int vcc;
+
+       cfg_mem = kzalloc(sizeof(struct pcmcia_cfg_mem), GFP_KERNEL);
+       if (cfg_mem == NULL)
+               return -ENOMEM;
+
+       /* get the current Vcc setting */
+       vcc = p_dev->socket->socket.Vcc;
+
+       tuple = &cfg_mem->tuple;
+       tuple->TupleData = cfg_mem->buf;
+       tuple->TupleDataMax = 255;
+       tuple->TupleOffset = 0;
+       tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
+       tuple->Attributes = 0;
+
+       ret = pcmcia_get_first_tuple(p_dev, tuple);
+       while (!ret) {
+               cistpl_cftable_entry_t *cfg = &cfg_mem->parse.cftable_entry;
+
+               if (pcmcia_get_tuple_data(p_dev, tuple))
+                       goto next_entry;
+
+               if (pcmcia_parse_tuple(tuple, &cfg_mem->parse))
+                       goto next_entry;
+
+               /* default values */
+               p_dev->conf.ConfigIndex = cfg->index;
+               if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
+                       cfg_mem->dflt = *cfg;
+
+               ret = conf_check(p_dev, cfg, &cfg_mem->dflt, vcc, priv_data);
+               if (!ret)
+                       break;
+
+next_entry:
+               ret = pcmcia_get_next_tuple(p_dev, tuple);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(pcmcia_loop_config);
+
+#endif /* CONFIG_PCMCIA */
+
+#if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)
+
+void usb_unpoison_urb(struct urb *urb)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
+       unsigned long flags;
+#endif
+
+       if (!urb)
+               return;
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
+       spin_lock_irqsave(&usb_reject_lock, flags);
+#endif
+       --urb->reject;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
+       spin_unlock_irqrestore(&usb_reject_lock, flags);
+#endif
+}
+EXPORT_SYMBOL_GPL(usb_unpoison_urb);
+
+
+#if 0
+/**
+ * usb_poison_anchored_urbs - cease all traffic from an anchor
+ * @anchor: anchor the requests are bound to
+ *
+ * this allows all outstanding URBs to be poisoned starting
+ * from the back of the queue. Newly added URBs will also be
+ * poisoned
+ *
+ * This routine should not be called by a driver after its disconnect
+ * method has returned.
+ */
+void usb_poison_anchored_urbs(struct usb_anchor *anchor)
+{
+       struct urb *victim;
+
+       spin_lock_irq(&anchor->lock);
+       // anchor->poisoned = 1; /* XXX: Cannot backport */
+       while (!list_empty(&anchor->urb_list)) {
+               victim = list_entry(anchor->urb_list.prev, struct urb,
+                                   anchor_list);
+               /* we must make sure the URB isn't freed before we kill it*/
+               usb_get_urb(victim);
+               spin_unlock_irq(&anchor->lock);
+               /* this will unanchor the URB */
+               usb_poison_urb(victim);
+               usb_put_urb(victim);
+               spin_lock_irq(&anchor->lock);
+       }
+       spin_unlock_irq(&anchor->lock);
+}
+EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs);
+#endif
+
+/**
+ * usb_get_from_anchor - get an anchor's oldest urb
+ * @anchor: the anchor whose urb you want
+ *
+ * this will take the oldest urb from an anchor,
+ * unanchor and return it
+ */
+struct urb *usb_get_from_anchor(struct usb_anchor *anchor)
+{
+       struct urb *victim;
+       unsigned long flags;
+
+       spin_lock_irqsave(&anchor->lock, flags);
+       if (!list_empty(&anchor->urb_list)) {
+               victim = list_entry(anchor->urb_list.next, struct urb,
+                                   anchor_list);
+               usb_get_urb(victim);
+               spin_unlock_irqrestore(&anchor->lock, flags);
+               usb_unanchor_urb(victim);
+       } else {
+               spin_unlock_irqrestore(&anchor->lock, flags);
+               victim = NULL;
+       }
+
+       return victim;
+}
+
+EXPORT_SYMBOL_GPL(usb_get_from_anchor);
+
+/**
+ * usb_scuttle_anchored_urbs - unanchor all an anchor's urbs
+ * @anchor: the anchor whose urbs you want to unanchor
+ *
+ * use this to get rid of all an anchor's urbs
+ */
+void usb_scuttle_anchored_urbs(struct usb_anchor *anchor)
+{
+       struct urb *victim;
+       unsigned long flags;
+
+       spin_lock_irqsave(&anchor->lock, flags);
+       while (!list_empty(&anchor->urb_list)) {
+               victim = list_entry(anchor->urb_list.prev, struct urb,
+                                   anchor_list);
+               usb_get_urb(victim);
+               spin_unlock_irqrestore(&anchor->lock, flags);
+               /* this may free the URB */
+               usb_unanchor_urb(victim);
+               usb_put_urb(victim);
+               spin_lock_irqsave(&anchor->lock, flags);
+       }
+       spin_unlock_irqrestore(&anchor->lock, flags);
+}
+
+EXPORT_SYMBOL_GPL(usb_scuttle_anchored_urbs);
+
+/**
+ * usb_anchor_empty - is an anchor empty
+ * @anchor: the anchor you want to query
+ *
+ * returns 1 if the anchor has no urbs associated with it
+ */
+int usb_anchor_empty(struct usb_anchor *anchor)
+{
+       return list_empty(&anchor->urb_list);
+}
+
+EXPORT_SYMBOL_GPL(usb_anchor_empty);
+#endif /* CONFIG_USB */
+#endif
+
+void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar)
+{
+       /*
+        * Make sure the BAR is actually a memory resource, not an IO resource
+        */
+       if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) {
+               WARN_ON(1);
+               return NULL;
+       }
+       return ioremap_nocache(pci_resource_start(pdev, bar),
+                                    pci_resource_len(pdev, bar));
+}
+EXPORT_SYMBOL_GPL(pci_ioremap_bar);
+
+static unsigned long round_jiffies_common(unsigned long j, int cpu,
+               bool force_up)
+{
+       int rem;
+       unsigned long original = j;
+
+       /*
+        * We don't want all cpus firing their timers at once hitting the
+        * same lock or cachelines, so we skew each extra cpu with an extra
+        * 3 jiffies. This 3 jiffies came originally from the mm/ code which
+        * already did this.
+        * The skew is done by adding 3*cpunr, then round, then subtract this
+        * extra offset again.
+        */
+       j += cpu * 3;
+
+       rem = j % HZ;
+
+       /*
+        * If the target jiffie is just after a whole second (which can happen
+        * due to delays of the timer irq, long irq off times etc etc) then
+        * we should round down to the whole second, not up. Use 1/4th second
+        * as cutoff for this rounding as an extreme upper bound for this.
+        * But never round down if @force_up is set.
+        */
+       if (rem < HZ/4 && !force_up) /* round down */
+               j = j - rem;
+       else /* round up */
+               j = j - rem + HZ;
+
+       /* now that we have rounded, subtract the extra skew again */
+       j -= cpu * 3;
+
+       if (j <= jiffies) /* rounding ate our timeout entirely; */
+               return original;
+       return j;
+}
+
+/**
+ * round_jiffies_up - function to round jiffies up to a full second
+ * @j: the time in (absolute) jiffies that should be rounded
+ *
+ * This is the same as round_jiffies() except that it will never
+ * round down.  This is useful for timeouts for which the exact time
+ * of firing does not matter too much, as long as they don't fire too
+ * early.
+ */
+unsigned long round_jiffies_up(unsigned long j)
+{
+       return round_jiffies_common(j, raw_smp_processor_id(), true);
+}
+EXPORT_SYMBOL_GPL(round_jiffies_up);
+
+void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
+               int size)
+{
+       skb_fill_page_desc(skb, i, page, off, size);
+       skb->len += size;
+       skb->data_len += size;
+       skb->truesize += size;
+}
+EXPORT_SYMBOL(skb_add_rx_frag);
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) */
diff --git a/compat/compat-2.6.29.c b/compat/compat-2.6.29.c
new file mode 100644 (file)
index 0000000..c8e0183
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.29.
+ */
+
+#include <linux/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29))
+
+#include <linux/usb.h>
+#include <linux/etherdevice.h>
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23))
+#if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)
+/**
+ * usb_unpoison_anchored_urbs - let an anchor be used successfully again
+ * @anchor: anchor the requests are bound to
+ *
+ * Reverses the effect of usb_poison_anchored_urbs
+ * the anchor can be used normally after it returns
+ */
+void usb_unpoison_anchored_urbs(struct usb_anchor *anchor)
+{
+       unsigned long flags;
+       struct urb *lazarus;
+
+       spin_lock_irqsave(&anchor->lock, flags);
+       list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) {
+               usb_unpoison_urb(lazarus);
+       }
+       //anchor->poisoned = 0; /* XXX: cannot backport */
+       spin_unlock_irqrestore(&anchor->lock, flags);
+}
+EXPORT_SYMBOL_GPL(usb_unpoison_anchored_urbs);
+#endif /* CONFIG_USB */
+#endif
+
+/**
+ * eth_mac_addr - set new Ethernet hardware address
+ * @dev: network device
+ * @p: socket address
+ * Change hardware address of device.
+ *
+ * This doesn't change hardware matching, so needs to be overridden
+ * for most real devices.
+ */
+int eth_mac_addr(struct net_device *dev, void *p)
+{
+       struct sockaddr *addr = p;
+
+       if (netif_running(dev))
+               return -EBUSY;
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EADDRNOTAVAIL;
+       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+       return 0;
+}
+EXPORT_SYMBOL(eth_mac_addr);
+/* Source: net/ethernet/eth.c */
+
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) */
+
diff --git a/compat/compat-2.6.30.c b/compat/compat-2.6.30.c
new file mode 100644 (file)
index 0000000..f821918
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.30.
+ */
+
+#include <linux/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30))
+
+/* 2.6.30 compat code goes here */
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) */
+
diff --git a/compat/compat-2.6.31.c b/compat/compat-2.6.31.c
new file mode 100644 (file)
index 0000000..dc8588f
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.31.
+ */
+
+#include <linux/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31))
+
+#include <linux/netdevice.h>
+
+/**
+ * genl_register_family_with_ops - register a generic netlink family
+ * @family: generic netlink family
+ * @ops: operations to be registered
+ * @n_ops: number of elements to register
+ *
+ * Registers the specified family and operations from the specified table.
+ * Only one family may be registered with the same family name or identifier.
+ *
+ * The family id may equal GENL_ID_GENERATE causing an unique id to
+ * be automatically generated and assigned.
+ *
+ * Either a doit or dumpit callback must be specified for every registered
+ * operation or the function will fail. Only one operation structure per
+ * command identifier may be registered.
+ *
+ * See include/net/genetlink.h for more documenation on the operations
+ * structure.
+ *
+ * This is equivalent to calling genl_register_family() followed by
+ * genl_register_ops() for every operation entry in the table taking
+ * care to unregister the family on error path.
+ *
+ * Return 0 on success or a negative error code.
+ */
+int genl_register_family_with_ops(struct genl_family *family,
+       struct genl_ops *ops, size_t n_ops)
+{
+       int err, i;
+
+       err = genl_register_family(family);
+       if (err)
+               return err;
+
+       for (i = 0; i < n_ops; ++i, ++ops) {
+               err = genl_register_ops(family, ops);
+               if (err)
+                       goto err_out;
+       }
+       return 0;
+err_out:
+       genl_unregister_family(family);
+       return err;
+}
+EXPORT_SYMBOL(genl_register_family_with_ops);
+
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)) */
+
diff --git a/compat/compat-2.6.32.c b/compat/compat-2.6.32.c
new file mode 100644 (file)
index 0000000..22c2c19
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2007      Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.32.
+ */
+
+#include <linux/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32))
+
+#include <linux/netdevice.h>
+
+int __dev_addr_add(struct dev_addr_list **list, int *count,
+                  void *addr, int alen, int glbl)
+{
+       struct dev_addr_list *da;
+
+       for (da = *list; da != NULL; da = da->next) {
+               if (memcmp(da->da_addr, addr, da->da_addrlen) == 0 &&
+                   da->da_addrlen == alen) {
+                       if (glbl) {
+                               int old_glbl = da->da_gusers;
+                               da->da_gusers = 1;
+                               if (old_glbl)
+                                       return 0;
+                       }
+                       da->da_users++;
+                       return 0;
+               }
+       }
+
+       da = kzalloc(sizeof(*da), GFP_ATOMIC);
+       if (da == NULL)
+               return -ENOMEM;
+       memcpy(da->da_addr, addr, alen);
+       da->da_addrlen = alen;
+       da->da_users = 1;
+       da->da_gusers = glbl ? 1 : 0;
+       da->next = *list;
+       *list = da;
+       (*count)++;
+       return 0;
+}
+
+int __dev_addr_delete(struct dev_addr_list **list, int *count,
+                     void *addr, int alen, int glbl)
+{
+       struct dev_addr_list *da;
+
+       for (; (da = *list) != NULL; list = &da->next) {
+               if (memcmp(da->da_addr, addr, da->da_addrlen) == 0 &&
+                   alen == da->da_addrlen) {
+                       if (glbl) {
+                               int old_glbl = da->da_gusers;
+                               da->da_gusers = 0;
+                               if (old_glbl == 0)
+                                       break;
+                       }
+                       if (--da->da_users)
+                               return 0;
+
+                       *list = da->next;
+                       kfree(da);
+                       (*count)--;
+                       return 0;
+               }
+       }
+       return -ENOENT;
+}
+
+int __dev_addr_sync(struct dev_addr_list **to, int *to_count,
+                   struct dev_addr_list **from, int *from_count)
+{
+       struct dev_addr_list *da, *next;
+       int err = 0;
+
+       da = *from;
+       while (da != NULL) {
+               next = da->next;
+               if (!da->da_synced) {
+                       err = __dev_addr_add(to, to_count,
+                                            da->da_addr, da->da_addrlen, 0);
+                       if (err < 0)
+                               break;
+                       da->da_synced = 1;
+                       da->da_users++;
+               } else if (da->da_users == 1) {
+                       __dev_addr_delete(to, to_count,
+                                         da->da_addr, da->da_addrlen, 0);
+                       __dev_addr_delete(from, from_count,
+                                         da->da_addr, da->da_addrlen, 0);
+               }
+               da = next;
+       }
+       return err;
+}
+EXPORT_SYMBOL_GPL(__dev_addr_sync);
+
+void __dev_addr_unsync(struct dev_addr_list **to, int *to_count,
+                      struct dev_addr_list **from, int *from_count)
+{
+       struct dev_addr_list *da, *next;
+
+       da = *from;
+       while (da != NULL) {
+               next = da->next;
+               if (da->da_synced) {
+                       __dev_addr_delete(to, to_count,
+                                         da->da_addr, da->da_addrlen, 0);
+                       da->da_synced = 0;
+                       __dev_addr_delete(from, from_count,
+                                         da->da_addr, da->da_addrlen, 0);
+               }
+               da = next;
+       }
+}
+EXPORT_SYMBOL_GPL(__dev_addr_unsync);
+
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) */
+
diff --git a/compat/compat-2.6.33.c b/compat/compat-2.6.33.c
new file mode 100644 (file)
index 0000000..055082e
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2009      Hauke Mehrtens <hauke@hauke-m.de>
+ *
+ * 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.
+ *
+ * Compatibility file for Linux wireless for kernels 2.6.33.
+ */
+
+#include <linux/compat.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33))
+
+#include <linux/autoconf.h>
+
+#if defined(CONFIG_PCCARD) || defined(CONFIG_PCCARD_MODULE)
+
+/**
+ * pccard_loop_tuple() - loop over tuples in the CIS
+ * @s:         the struct pcmcia_socket where the card is inserted
+ * @function:  the device function we loop for
+ * @code:      which CIS code shall we look for?
+ * @parse:     buffer where the tuple shall be parsed (or NULL, if no parse)
+ * @priv_data: private data to be passed to the loop_tuple function.
+ * @loop_tuple:        function to call for each CIS entry of type @function. IT
+ *             gets passed the raw tuple, the paresed tuple (if @parse is
+ *             set) and @priv_data.
+ *
+ * pccard_loop_tuple() loops over all CIS entries of type @function, and
+ * calls the @loop_tuple function for each entry. If the call to @loop_tuple
+ * returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
+ */
+int pccard_loop_tuple(struct pcmcia_socket *s, unsigned int function,
+                     cisdata_t code, cisparse_t *parse, void *priv_data,
+                     int (*loop_tuple) (tuple_t *tuple,
+                                        cisparse_t *parse,
+                                        void *priv_data))
+{
+       tuple_t tuple;
+       cisdata_t *buf;
+       int ret;
+
+       buf = kzalloc(256, GFP_KERNEL);
+       if (buf == NULL) {
+               dev_printk(KERN_WARNING, &s->dev, "no memory to read tuple\n");
+               return -ENOMEM;
+       }
+
+       tuple.TupleData = buf;
+       tuple.TupleDataMax = 255;
+       tuple.TupleOffset = 0;
+       tuple.DesiredTuple = code;
+       tuple.Attributes = 0;
+
+       ret = pccard_get_first_tuple(s, function, &tuple);
+       while (!ret) {
+               if (pccard_get_tuple_data(s, &tuple))
+                       goto next_entry;
+
+               if (parse)
+                       if (pcmcia_parse_tuple(&tuple, parse))
+                               goto next_entry;
+
+               ret = loop_tuple(&tuple, parse, priv_data);
+               if (!ret)
+                       break;
+
+next_entry:
+               ret = pccard_get_next_tuple(s, function, &tuple);
+       }
+
+       kfree(buf);
+       return ret;
+}
+EXPORT_SYMBOL(pccard_loop_tuple);
+/* Source: drivers/pcmcia/cistpl.c */
+
+#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
+
+struct pcmcia_loop_mem {
+       struct pcmcia_device *p_dev;
+       void *priv_data;
+       int (*loop_tuple) (struct pcmcia_device *p_dev,
+                          tuple_t *tuple,
+                          void *priv_data);
+};
+
+/**
+ * pcmcia_do_loop_tuple() - internal helper for pcmcia_loop_config()
+ *
+ * pcmcia_do_loop_tuple() is the internal callback for the call from
+ * pcmcia_loop_tuple() to pccard_loop_tuple(). Data is transferred
+ * by a struct pcmcia_cfg_mem.
+ */
+static int pcmcia_do_loop_tuple(tuple_t *tuple, cisparse_t *parse, void *priv)
+{
+       struct pcmcia_loop_mem *loop = priv;
+
+       return loop->loop_tuple(loop->p_dev, tuple, loop->priv_data);
+};
+
+/**
+ * pcmcia_loop_tuple() - loop over tuples in the CIS
+ * @p_dev:     the struct pcmcia_device which we need to loop for.
+ * @code:      which CIS code shall we look for?
+ * @priv_data: private data to be passed to the loop_tuple function.
+ * @loop_tuple:        function to call for each CIS entry of type @function. IT
+ *             gets passed the raw tuple and @priv_data.
+ *
+ * pcmcia_loop_tuple() loops over all CIS entries of type @function, and
+ * calls the @loop_tuple function for each entry. If the call to @loop_tuple
+ * returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
+ */
+int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
+                     int (*loop_tuple) (struct pcmcia_device *p_dev,
+                                        tuple_t *tuple,
+                                        void *priv_data),
+                     void *priv_data)
+{
+       struct pcmcia_loop_mem loop = {
+               .p_dev = p_dev,
+               .loop_tuple = loop_tuple,
+               .priv_data = priv_data};
+
+       return pccard_loop_tuple(p_dev->socket, p_dev->func, code, NULL,
+                                &loop, pcmcia_do_loop_tuple);
+}
+EXPORT_SYMBOL(pcmcia_loop_tuple);
+/* Source: drivers/pcmcia/pcmcia_resource.c */
+
+#endif /* CONFIG_PCMCIA */
+
+#endif /* CONFIG_PCCARD */
+
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)) */
+
diff --git a/compat/compat_firmware_class.c b/compat/compat_firmware_class.c
new file mode 100644 (file)
index 0000000..ce937a3
--- /dev/null
@@ -0,0 +1,726 @@
+/*
+ * firmware_class.c - Multi purpose firmware loading support
+ *
+ * Copyright (c) 2003 Manuel Estrada Sainz
+ *
+ * Please see Documentation/firmware_class/ for more information.
+ *
+ */
+
+#include <linux/capability.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/timer.h>
+#include <linux/vmalloc.h>
+#include <linux/interrupt.h>
+#include <linux/bitops.h>
+#include <linux/mutex.h>
+#include <linux/kthread.h>
+#include <linux/highmem.h>
+#include <linux/firmware.h>
+
+#define to_dev(obj) container_of(obj, struct device, kobj)
+
+MODULE_AUTHOR("Manuel Estrada Sainz");
+MODULE_DESCRIPTION("Multi purpose firmware loading support");
+MODULE_LICENSE("GPL");
+
+enum {
+       FW_STATUS_LOADING,
+       FW_STATUS_DONE,
+       FW_STATUS_ABORT,
+};
+
+static int loading_timeout = 60;       /* In seconds */
+
+/* fw_lock could be moved to 'struct firmware_priv' but since it is just
+ * guarding for corner cases a global lock should be OK */
+static DEFINE_MUTEX(fw_lock);
+
+struct firmware_priv {
+       char *fw_id;
+       struct completion completion;
+       struct bin_attribute attr_data;
+       struct firmware *fw;
+       unsigned long status;
+       struct page **pages;
+       int nr_pages;
+       int page_array_size;
+       const char *vdata;
+       struct timer_list timeout;
+};
+
+//#ifdef CONFIG_FW_LOADER
+#if 0
+extern struct builtin_fw __start_builtin_fw[];
+extern struct builtin_fw __end_builtin_fw[];
+#else /* Module case. Avoid ifdefs later; it'll all optimise out */
+static struct builtin_fw *__start_builtin_fw;
+static struct builtin_fw *__end_builtin_fw;
+#endif
+
+static void
+fw_load_abort(struct firmware_priv *fw_priv)
+{
+       set_bit(FW_STATUS_ABORT, &fw_priv->status);
+       wmb();
+       complete(&fw_priv->completion);
+}
+
+static ssize_t
+firmware_timeout_show(struct class *class, char *buf)
+{
+       return sprintf(buf, "%d\n", loading_timeout);
+}
+
+/**
+ * firmware_timeout_store - set number of seconds to wait for firmware
+ * @class: device class pointer
+ * @buf: buffer to scan for timeout value
+ * @count: number of bytes in @buf
+ *
+ *     Sets the number of seconds to wait for the firmware.  Once
+ *     this expires an error will be returned to the driver and no
+ *     firmware will be provided.
+ *
+ *     Note: zero means 'wait forever'.
+ **/
+static ssize_t
+firmware_timeout_store(struct class *class, const char *buf, size_t count)
+{
+       loading_timeout = simple_strtol(buf, NULL, 10);
+       if (loading_timeout < 0)
+               loading_timeout = 0;
+       return count;
+}
+
+static CLASS_ATTR(timeout, 0644, firmware_timeout_show, firmware_timeout_store);
+
+static void fw_dev_release(struct device *dev);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
+static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
+{
+       struct firmware_priv *fw_priv = dev_get_drvdata(dev);
+
+       if (add_uevent_var(env, "FIRMWARE=%s", fw_priv->fw_id))
+               return -ENOMEM;
+       if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout))
+               return -ENOMEM;
+
+       return 0;
+}
+#else
+static int firmware_uevent(struct device *dev, char **envp,
+                          int num_envp, char *buf, int size)
+{
+       struct firmware_priv *fw_priv = dev_get_drvdata(dev);
+       int error, len = 0, i = 0;
+
+       error = add_uevent_var(envp, num_envp, &i,
+                              buf, size, &len,
+                              "FIRMWARE=%s", fw_priv->fw_id);
+       if (error)
+               goto exit;
+
+       error = add_uevent_var(envp, num_envp, &i,
+                              buf, size, &len,
+                              "TIMEOUT=%i", loading_timeout);
+       if (error)
+               goto exit;
+
+       return 0;
+exit:
+       envp[i] = NULL;
+       return error;
+}
+#endif
+
+static struct class firmware_class = {
+       .name           = "compat_firmware",
+       .dev_uevent     = firmware_uevent,
+       .dev_release    = fw_dev_release,
+};
+
+static ssize_t firmware_loading_show(struct device *dev,
+                                    struct device_attribute *attr, char *buf)
+{
+       struct firmware_priv *fw_priv = dev_get_drvdata(dev);
+       int loading = test_bit(FW_STATUS_LOADING, &fw_priv->status);
+       return sprintf(buf, "%d\n", loading);
+}
+
+/* Some architectures don't have PAGE_KERNEL_RO */
+#ifndef PAGE_KERNEL_RO
+#define PAGE_KERNEL_RO PAGE_KERNEL
+#endif
+/**
+ * firmware_loading_store - set value in the 'loading' control file
+ * @dev: device pointer
+ * @attr: device attribute pointer
+ * @buf: buffer to scan for loading control value
+ * @count: number of bytes in @buf
+ *
+ *     The relevant values are:
+ *
+ *      1: Start a load, discarding any previous partial load.
+ *      0: Conclude the load and hand the data to the driver code.
+ *     -1: Conclude the load with an error and discard any written data.
+ **/
+static ssize_t firmware_loading_store(struct device *dev,
+                                     struct device_attribute *attr,
+                                     const char *buf, size_t count)
+{
+       struct firmware_priv *fw_priv = dev_get_drvdata(dev);
+       int loading = simple_strtol(buf, NULL, 10);
+       int i;
+
+       switch (loading) {
+       case 1:
+               mutex_lock(&fw_lock);
+               if (!fw_priv->fw) {
+                       mutex_unlock(&fw_lock);
+                       break;
+               }
+               vfree(fw_priv->fw->data);
+               fw_priv->fw->data = NULL;
+               for (i = 0; i < fw_priv->nr_pages; i++)
+                       __free_page(fw_priv->pages[i]);
+               kfree(fw_priv->pages);
+               fw_priv->pages = NULL;
+               fw_priv->page_array_size = 0;
+               fw_priv->nr_pages = 0;
+               fw_priv->fw->size = 0;
+               set_bit(FW_STATUS_LOADING, &fw_priv->status);
+               mutex_unlock(&fw_lock);
+               break;
+       case 0:
+               if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) {
+                       vfree(fw_priv->fw->data);
+                       fw_priv->fw->data = vmap(fw_priv->pages,
+                                                fw_priv->nr_pages,
+                                                0, PAGE_KERNEL_RO);
+                       if (!fw_priv->fw->data) {
+                               dev_err(dev, "%s: vmap() failed\n", __func__);
+                               goto err;
+                       }
+                       /* Pages will be freed by vfree() */
+                       fw_priv->page_array_size = 0;
+                       fw_priv->nr_pages = 0;
+                       complete(&fw_priv->completion);
+                       clear_bit(FW_STATUS_LOADING, &fw_priv->status);
+                       break;
+               }
+               /* fallthrough */
+       default:
+               dev_err(dev, "%s: unexpected value (%d)\n", __func__, loading);
+               /* fallthrough */
+       case -1:
+       err:
+               fw_load_abort(fw_priv);
+               break;
+       }
+
+       return count;
+}
+
+static DEVICE_ATTR(loading, 0644, firmware_loading_show, firmware_loading_store);
+
+static ssize_t
+firmware_data_read(struct kobject *kobj, struct bin_attribute *bin_attr,
+                  char *buffer, loff_t offset, size_t count)
+{
+       struct device *dev = to_dev(kobj);
+       struct firmware_priv *fw_priv = dev_get_drvdata(dev);
+       struct firmware *fw;
+       ssize_t ret_count;
+
+       mutex_lock(&fw_lock);
+       fw = fw_priv->fw;
+       if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) {
+               ret_count = -ENODEV;
+               goto out;
+       }
+       if (offset > fw->size) {
+               ret_count = 0;
+               goto out;
+       }
+       if (count > fw->size - offset)
+               count = fw->size - offset;
+
+       ret_count = count;
+
+       while (count) {
+               void *page_data;
+               int page_nr = offset >> PAGE_SHIFT;
+               int page_ofs = offset & (PAGE_SIZE-1);
+               int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count);
+
+               page_data = kmap(fw_priv->pages[page_nr]);
+
+               memcpy(buffer, page_data + page_ofs, page_cnt);
+
+               kunmap(fw_priv->pages[page_nr]);
+               buffer += page_cnt;
+               offset += page_cnt;
+               count -= page_cnt;
+       }
+out:
+       mutex_unlock(&fw_lock);
+       return ret_count;
+}
+
+static int
+fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
+{
+       int pages_needed = ALIGN(min_size, PAGE_SIZE) >> PAGE_SHIFT;
+
+       /* If the array of pages is too small, grow it... */
+       if (fw_priv->page_array_size < pages_needed) {
+               int new_array_size = max(pages_needed,
+                                        fw_priv->page_array_size * 2);
+               struct page **new_pages;
+
+               new_pages = kmalloc(new_array_size * sizeof(void *),
+                                   GFP_KERNEL);
+               if (!new_pages) {
+                       fw_load_abort(fw_priv);
+                       return -ENOMEM;
+               }
+               memcpy(new_pages, fw_priv->pages,
+                      fw_priv->page_array_size * sizeof(void *));
+               memset(&new_pages[fw_priv->page_array_size], 0, sizeof(void *) *
+                      (new_array_size - fw_priv->page_array_size));
+               kfree(fw_priv->pages);
+               fw_priv->pages = new_pages;
+               fw_priv->page_array_size = new_array_size;
+       }
+
+       while (fw_priv->nr_pages < pages_needed) {
+               fw_priv->pages[fw_priv->nr_pages] =
+                       alloc_page(GFP_KERNEL | __GFP_HIGHMEM);
+
+               if (!fw_priv->pages[fw_priv->nr_pages]) {
+                       fw_load_abort(fw_priv);
+                       return -ENOMEM;
+               }
+               fw_priv->nr_pages++;
+       }
+       return 0;
+}
+
+/**
+ * firmware_data_write - write method for firmware
+ * @kobj: kobject for the device
+ * @bin_attr: bin_attr structure
+ * @buffer: buffer being written
+ * @offset: buffer offset for write in total data store area
+ * @count: buffer size
+ *
+ *     Data written to the 'data' attribute will be later handed to
+ *     the driver as a firmware image.
+ **/
+static ssize_t
+firmware_data_write(struct kobject *kobj, struct bin_attribute *bin_attr,
+                   char *buffer, loff_t offset, size_t count)
+{
+       struct device *dev = to_dev(kobj);
+       struct firmware_priv *fw_priv = dev_get_drvdata(dev);
+       struct firmware *fw;
+       ssize_t retval;
+
+       if (!capable(CAP_SYS_RAWIO))
+               return -EPERM;
+
+       mutex_lock(&fw_lock);
+       fw = fw_priv->fw;
+       if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) {
+               retval = -ENODEV;
+               goto out;
+       }
+       retval = fw_realloc_buffer(fw_priv, offset + count);
+       if (retval)
+               goto out;
+
+       retval = count;
+
+       while (count) {
+               void *page_data;
+               int page_nr = offset >> PAGE_SHIFT;
+               int page_ofs = offset & (PAGE_SIZE - 1);
+               int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count);
+
+               page_data = kmap(fw_priv->pages[page_nr]);
+
+               memcpy(page_data + page_ofs, buffer, page_cnt);
+
+               kunmap(fw_priv->pages[page_nr]);
+               buffer += page_cnt;
+               offset += page_cnt;
+               count -= page_cnt;
+       }
+
+       fw->size = max_t(size_t, offset, fw->size);
+out:
+       mutex_unlock(&fw_lock);
+       return retval;
+}
+
+static struct bin_attribute firmware_attr_data_tmpl = {
+       .attr = {.name = "data", .mode = 0644},
+       .size = 0,
+       .read = firmware_data_read,
+       .write = firmware_data_write,
+};
+
+static void fw_dev_release(struct device *dev)
+{
+       struct firmware_priv *fw_priv = dev_get_drvdata(dev);
+       int i;
+
+       for (i = 0; i < fw_priv->nr_pages; i++)
+               __free_page(fw_priv->pages[i]);
+       kfree(fw_priv->pages);
+       kfree(fw_priv->fw_id);
+       kfree(fw_priv);
+       kfree(dev);
+
+       module_put(THIS_MODULE);
+}
+
+static void
+firmware_class_timeout(u_long data)
+{
+       struct firmware_priv *fw_priv = (struct firmware_priv *) data;
+       fw_load_abort(fw_priv);
+}
+
+static int fw_register_device(struct device **dev_p, const char *fw_name,
+                             struct device *device)
+{
+       int retval;
+       struct firmware_priv *fw_priv = kzalloc(sizeof(*fw_priv),
+                                               GFP_KERNEL);
+       struct device *f_dev = kzalloc(sizeof(*f_dev), GFP_KERNEL);
+
+       *dev_p = NULL;
+
+       if (!fw_priv || !f_dev) {
+               dev_err(device, "%s: kmalloc failed\n", __func__);
+               retval = -ENOMEM;
+               goto error_kfree;
+       }
+
+       init_completion(&fw_priv->completion);
+       fw_priv->attr_data = firmware_attr_data_tmpl;
+       fw_priv->fw_id = kstrdup(fw_name, GFP_KERNEL);
+       if (!fw_priv->fw_id) {
+               dev_err(device, "%s: Firmware name allocation failed\n",
+                       __func__);
+               retval = -ENOMEM;
+               goto error_kfree;
+       }
+
+       fw_priv->timeout.function = firmware_class_timeout;
+       fw_priv->timeout.data = (u_long) fw_priv;
+       init_timer(&fw_priv->timeout);
+
+       dev_set_name(f_dev, "%s", dev_name(device));
+       f_dev->parent = device;
+       f_dev->class = &firmware_class;
+       dev_set_drvdata(f_dev, fw_priv);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+       dev_set_uevent_suppress(f_dev, 1);
+#endif
+       retval = device_register(f_dev);
+       if (retval) {
+               dev_err(device, "%s: device_register failed\n", __func__);
+               put_device(f_dev);
+               return retval;
+       }
+       *dev_p = f_dev;
+       return 0;
+
+error_kfree:
+       kfree(f_dev);
+       kfree(fw_priv);
+       return retval;
+}
+
+static int fw_setup_device(struct firmware *fw, struct device **dev_p,
+                          const char *fw_name, struct device *device,
+                          int uevent)
+{
+       struct device *f_dev;
+       struct firmware_priv *fw_priv;
+       int retval;
+
+       *dev_p = NULL;
+       retval = fw_register_device(&f_dev, fw_name, device);
+       if (retval)
+               goto out;
+
+       /* Need to pin this module until class device is destroyed */
+       __module_get(THIS_MODULE);
+
+       fw_priv = dev_get_drvdata(f_dev);
+
+       fw_priv->fw = fw;
+       retval = sysfs_create_bin_file(&f_dev->kobj, &fw_priv->attr_data);
+       if (retval) {
+               dev_err(device, "%s: sysfs_create_bin_file failed\n", __func__);
+               goto error_unreg;
+       }
+
+       retval = device_create_file(f_dev, &dev_attr_loading);
+       if (retval) {
+               dev_err(device, "%s: device_create_file failed\n", __func__);
+               goto error_unreg;
+       }
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+       if (uevent)
+               dev_set_uevent_suppress(f_dev, 0);
+#endif
+       *dev_p = f_dev;
+       goto out;
+
+error_unreg:
+       device_unregister(f_dev);
+out:
+       return retval;
+}
+
+static int
+_request_firmware(const struct firmware **firmware_p, const char *name,
+                struct device *device, int uevent)
+{
+       struct device *f_dev;
+       struct firmware_priv *fw_priv;
+       struct firmware *firmware;
+       struct builtin_fw *builtin;
+       int retval;
+
+       if (!firmware_p)
+               return -EINVAL;
+
+       *firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);
+       if (!firmware) {
+               dev_err(device, "%s: kmalloc(struct firmware) failed\n",
+                       __func__);
+               retval = -ENOMEM;
+               goto out;
+       }
+
+       for (builtin = __start_builtin_fw; builtin != __end_builtin_fw;
+            builtin++) {
+               if (strcmp(name, builtin->name))
+                       continue;
+               dev_info(device, "firmware: using built-in firmware %s\n",
+                        name);
+               firmware->size = builtin->size;
+               firmware->data = builtin->data;
+               return 0;
+       }
+
+       if (uevent)
+               dev_info(device, "firmware: requesting %s\n", name);
+
+       retval = fw_setup_device(firmware, &f_dev, name, device, uevent);
+       if (retval)
+               goto error_kfree_fw;
+
+       fw_priv = dev_get_drvdata(f_dev);
+
+       if (uevent) {
+               if (loading_timeout > 0) {
+                       fw_priv->timeout.expires = jiffies + loading_timeout * HZ;
+                       add_timer(&fw_priv->timeout);
+               }
+
+               kobject_uevent(&f_dev->kobj, KOBJ_ADD);
+               wait_for_completion(&fw_priv->completion);
+               set_bit(FW_STATUS_DONE, &fw_priv->status);
+               del_timer_sync(&fw_priv->timeout);
+       } else
+               wait_for_completion(&fw_priv->completion);
+
+       mutex_lock(&fw_lock);
+       if (!fw_priv->fw->size || test_bit(FW_STATUS_ABORT, &fw_priv->status)) {
+               retval = -ENOENT;
+               release_firmware(fw_priv->fw);
+               *firmware_p = NULL;
+       }
+       fw_priv->fw = NULL;
+       mutex_unlock(&fw_lock);
+       device_unregister(f_dev);
+       goto out;
+
+error_kfree_fw:
+       kfree(firmware);
+       *firmware_p = NULL;
+out:
+       return retval;
+}
+
+/**
+ * request_firmware: - send firmware request and wait for it
+ * @firmware_p: pointer to firmware image
+ * @name: name of firmware file
+ * @device: device for which firmware is being loaded
+ *
+ *      @firmware_p will be used to return a firmware image by the name
+ *      of @name for device @device.
+ *
+ *      Should be called from user context where sleeping is allowed.
+ *
+ *      @name will be used as $FIRMWARE in the uevent environment and
+ *      should be distinctive enough not to be confused with any other
+ *      firmware image for this or any other device.
+ **/
+int
+request_firmware(const struct firmware **firmware_p, const char *name,
+                 struct device *device)
+{
+        int uevent = 1;
+        return _request_firmware(firmware_p, name, device, uevent);
+}
+
+/**
+ * release_firmware: - release the resource associated with a firmware image
+ * @fw: firmware resource to release
+ **/
+void
+release_firmware(const struct firmware *fw)
+{
+       struct builtin_fw *builtin;
+
+       if (fw) {
+               for (builtin = __start_builtin_fw; builtin != __end_builtin_fw;
+                    builtin++) {
+                       if (fw->data == builtin->data)
+                               goto free_fw;
+               }
+               vfree(fw->data);
+       free_fw:
+               kfree(fw);
+       }
+}
+
+/* Async support */
+struct firmware_work {
+       struct work_struct work;
+       struct module *module;
+       const char *name;
+       struct device *device;
+       void *context;
+       void (*cont)(const struct firmware *fw, void *context);
+       int uevent;
+};
+
+static int
+request_firmware_work_func(void *arg)
+{
+       struct firmware_work *fw_work = arg;
+       const struct firmware *fw;
+       int ret;
+       if (!arg) {
+               WARN_ON(1);
+               return 0;
+       }
+       ret = _request_firmware(&fw, fw_work->name, fw_work->device,
+               fw_work->uevent);
+
+       fw_work->cont(fw, fw_work->context);
+
+       module_put(fw_work->module);
+       kfree(fw_work);
+       return ret;
+}
+
+/**
+ * request_firmware_nowait: asynchronous version of request_firmware
+ * @module: module requesting the firmware
+ * @uevent: sends uevent to copy the firmware image if this flag
+ *     is non-zero else the firmware copy must be done manually.
+ * @name: name of firmware file
+ * @device: device for which firmware is being loaded
+ * @gfp: allocation flags
+ * @context: will be passed over to @cont, and
+ *     @fw may be %NULL if firmware request fails.
+ * @cont: function will be called asynchronously when the firmware
+ *     request is over.
+ *
+ *     Asynchronous variant of request_firmware() for user contexts where
+ *     it is not possible to sleep for long time. It can't be called
+ *     in atomic contexts.
+ **/
+int
+request_firmware_nowait(
+       struct module *module, int uevent,
+       const char *name, struct device *device, gfp_t gfp, void *context,
+       void (*cont)(const struct firmware *fw, void *context))
+{
+       struct task_struct *task;
+       struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work),
+                                               gfp);
+
+       if (!fw_work)
+               return -ENOMEM;
+       if (!try_module_get(module)) {
+               kfree(fw_work);
+               return -EFAULT;
+       }
+
+       *fw_work = (struct firmware_work) {
+               .module = module,
+               .name = name,
+               .device = device,
+               .context = context,
+               .cont = cont,
+               .uevent = uevent,
+       };
+
+       task = kthread_run(request_firmware_work_func, fw_work,
+                           "firmware/%s", name);
+
+       if (IS_ERR(task)) {
+               fw_work->cont(NULL, fw_work->context);
+               module_put(fw_work->module);
+               kfree(fw_work);
+               return PTR_ERR(task);
+       }
+       return 0;
+}
+
+static int __init
+firmware_class_init(void)
+{
+       int error;
+       error = class_register(&firmware_class);
+       if (error) {
+               printk(KERN_ERR "%s: class_register failed\n", __func__);
+               return error;
+       }
+       error = class_create_file(&firmware_class, &class_attr_timeout);
+       if (error) {
+               printk(KERN_ERR "%s: class_create_file failed\n",
+                      __func__);
+               class_unregister(&firmware_class);
+       }
+       return error;
+
+}
+static void __exit
+firmware_class_exit(void)
+{
+       class_unregister(&firmware_class);
+}
+
+fs_initcall(firmware_class_init);
+module_exit(firmware_class_exit);
+
+EXPORT_SYMBOL(release_firmware);
+EXPORT_SYMBOL(request_firmware);
+EXPORT_SYMBOL(request_firmware_nowait);
diff --git a/compat/main.c b/compat/main.c
new file mode 100644 (file)
index 0000000..d7f713d
--- /dev/null
@@ -0,0 +1,25 @@
+#include <linux/module.h>
+
+MODULE_AUTHOR("Luis R. Rodriguez");
+MODULE_DESCRIPTION("Kernel compatibility module");
+MODULE_LICENSE("GPL");
+
+static int __init compat_init(void)
+{
+       /* pm-qos for kernels <= 2.6.24, this is a no-op on newer kernels */
+       compat_pm_qos_power_init();
+       printk(KERN_INFO "Generic kernel compatibility enabled based on "
+              "linux-next next-20100113\n");
+
+        return 0;
+}
+module_init(compat_init);
+
+static void __exit compat_exit(void)
+{
+       compat_pm_qos_power_deinit();
+
+        return;
+}
+module_exit(compat_exit);
+
diff --git a/compat/pm_qos_params.c b/compat/pm_qos_params.c
new file mode 100644 (file)
index 0000000..833d98c
--- /dev/null
@@ -0,0 +1,477 @@
+#include <net/compat.h>
+
+/* This is the backport of pm-qos params for kernels <= 2.6.25 */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25))
+
+/*
+ * This module exposes the interface to kernel space for specifying
+ * QoS dependencies.  It provides infrastructure for registration of:
+ *
+ * Dependents on a QoS value : register requirements
+ * Watchers of QoS value : get notified when target QoS value changes
+ *
+ * This QoS design is best effort based.  Dependents register their QoS needs.
+ * Watchers register to keep track of the current QoS needs of the system.
+ *
+ * There are 3 basic classes of QoS parameter: latency, timeout, throughput
+ * each have defined units:
+ * latency: usec
+ * timeout: usec <-- currently not used.
+ * throughput: kbs (kilo byte / sec)
+ *
+ * There are lists of pm_qos_objects each one wrapping requirements, notifiers
+ *
+ * User mode requirements on a QOS parameter register themselves to the
+ * subsystem by opening the device node /dev/... and writing there request to
+ * the node.  As long as the process holds a file handle open to the node the
+ * client continues to be accounted for.  Upon file release the usermode
+ * requirement is removed and a new qos target is computed.  This way when the
+ * requirement that the application has is cleaned up when closes the file
+ * pointer or exits the pm_qos_object will get an opportunity to clean up.
+ *
+ * Mark Gross <mgross@linux.intel.com>
+ */
+
+#include <linux/pm_qos_params.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/slab.h>
+#include <linux/time.h>
+#include <linux/fs.h>
+#include <linux/device.h>
+#include <linux/miscdevice.h>
+#include <linux/string.h>
+#include <linux/platform_device.h>
+#include <linux/init.h>
+
+#include <linux/uaccess.h>
+
+/*
+ * locking rule: all changes to requirements or notifiers lists
+ * or pm_qos_object list and pm_qos_objects need to happen with pm_qos_lock
+ * held, taken with _irqsave.  One lock to rule them all
+ */
+struct requirement_list {
+       struct list_head list;
+       union {
+               s32 value;
+               s32 usec;
+               s32 kbps;
+       };
+       char *name;
+};
+
+static s32 max_compare(s32 v1, s32 v2);
+static s32 min_compare(s32 v1, s32 v2);
+
+struct pm_qos_object {
+       struct requirement_list requirements;
+       struct blocking_notifier_head *notifiers;
+       struct miscdevice pm_qos_power_miscdev;
+       char *name;
+       s32 default_value;
+       atomic_t target_value;
+       s32 (*comparitor)(s32, s32);
+};
+
+static struct pm_qos_object null_pm_qos;
+static BLOCKING_NOTIFIER_HEAD(cpu_dma_lat_notifier);
+static struct pm_qos_object cpu_dma_pm_qos = {
+       .requirements = {LIST_HEAD_INIT(cpu_dma_pm_qos.requirements.list)},
+       .notifiers = &cpu_dma_lat_notifier,
+       .name = "cpu_dma_latency",
+       .default_value = 2000 * USEC_PER_SEC,
+       .target_value = ATOMIC_INIT(2000 * USEC_PER_SEC),
+       .comparitor = min_compare
+};
+
+static BLOCKING_NOTIFIER_HEAD(network_lat_notifier);
+static struct pm_qos_object network_lat_pm_qos = {
+       .requirements = {LIST_HEAD_INIT(network_lat_pm_qos.requirements.list)},
+       .notifiers = &network_lat_notifier,
+       .name = "network_latency",
+       .default_value = 2000 * USEC_PER_SEC,
+       .target_value = ATOMIC_INIT(2000 * USEC_PER_SEC),
+       .comparitor = min_compare
+};
+
+
+static BLOCKING_NOTIFIER_HEAD(network_throughput_notifier);
+static struct pm_qos_object network_throughput_pm_qos = {
+       .requirements =
+               {LIST_HEAD_INIT(network_throughput_pm_qos.requirements.list)},
+       .notifiers = &network_throughput_notifier,
+       .name = "network_throughput",
+       .default_value = 0,
+       .target_value = ATOMIC_INIT(0),
+       .comparitor = max_compare
+};
+
+static BLOCKING_NOTIFIER_HEAD(system_bus_freq_notifier);
+static struct pm_qos_object system_bus_freq_pm_qos = {
+       .requirements =
+               {LIST_HEAD_INIT(system_bus_freq_pm_qos.requirements.list)},
+       .notifiers = &system_bus_freq_notifier,
+       .name = "system_bus_freq",
+       .default_value = 0,
+       .target_value = ATOMIC_INIT(0),
+       .comparitor = max_compare
+};
+
+
+static struct pm_qos_object *pm_qos_array[PM_QOS_NUM_CLASSES] = {
+       [PM_QOS_RESERVED] = &null_pm_qos,
+       [PM_QOS_CPU_DMA_LATENCY] = &cpu_dma_pm_qos,
+       [PM_QOS_NETWORK_LATENCY] = &network_lat_pm_qos,
+       [PM_QOS_NETWORK_THROUGHPUT] = &network_throughput_pm_qos,
+       [PM_QOS_SYSTEM_BUS_FREQ] = &system_bus_freq_pm_qos,
+};
+
+static DEFINE_SPINLOCK(pm_qos_lock);
+
+static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf,
+               size_t count, loff_t *f_pos);
+static int pm_qos_power_open(struct inode *inode, struct file *filp);
+static int pm_qos_power_release(struct inode *inode, struct file *filp);
+
+static const struct file_operations pm_qos_power_fops = {
+       .write = pm_qos_power_write,
+       .open = pm_qos_power_open,
+       .release = pm_qos_power_release,
+};
+
+/* static helper functions */
+static s32 max_compare(s32 v1, s32 v2)
+{
+       return max(v1, v2);
+}
+
+static s32 min_compare(s32 v1, s32 v2)
+{
+       return min(v1, v2);
+}
+
+
+static void update_target(int target)
+{
+       s32 extreme_value;
+       struct requirement_list *node;
+       unsigned long flags;
+       int call_notifier = 0;
+
+       spin_lock_irqsave(&pm_qos_lock, flags);
+       extreme_value = pm_qos_array[target]->default_value;
+       list_for_each_entry(node,
+                       &pm_qos_array[target]->requirements.list, list) {
+               extreme_value = pm_qos_array[target]->comparitor(
+                               extreme_value, node->value);
+       }
+       if (atomic_read(&pm_qos_array[target]->target_value) != extreme_value) {
+               call_notifier = 1;
+               atomic_set(&pm_qos_array[target]->target_value, extreme_value);
+               pr_debug(KERN_ERR "new target for qos %d is %d\n", target,
+                       atomic_read(&pm_qos_array[target]->target_value));
+       }
+       spin_unlock_irqrestore(&pm_qos_lock, flags);
+
+       if (call_notifier)
+               blocking_notifier_call_chain(pm_qos_array[target]->notifiers,
+                       (unsigned long) extreme_value, NULL);
+}
+
+static int register_pm_qos_misc(struct pm_qos_object *qos)
+{
+       qos->pm_qos_power_miscdev.minor = MISC_DYNAMIC_MINOR;
+       qos->pm_qos_power_miscdev.name = qos->name;
+       qos->pm_qos_power_miscdev.fops = &pm_qos_power_fops;
+
+       return misc_register(&qos->pm_qos_power_miscdev);
+}
+
+static int find_pm_qos_object_by_minor(int minor)
+{
+       int pm_qos_class;
+
+       for (pm_qos_class = 0;
+               pm_qos_class < PM_QOS_NUM_CLASSES; pm_qos_class++) {
+               if (minor ==
+                       pm_qos_array[pm_qos_class]->pm_qos_power_miscdev.minor)
+                       return pm_qos_class;
+       }
+       return -1;
+}
+
+/**
+ * pm_qos_requirement - returns current system wide qos expectation
+ * @pm_qos_class: identification of which qos value is requested
+ *
+ * This function returns the current target value in an atomic manner.
+ */
+int pm_qos_requirement(int pm_qos_class)
+{
+       return atomic_read(&pm_qos_array[pm_qos_class]->target_value);
+}
+EXPORT_SYMBOL_GPL(pm_qos_requirement);
+
+/**
+ * pm_qos_add_requirement - inserts new qos request into the list
+ * @pm_qos_class: identifies which list of qos request to us
+ * @name: identifies the request
+ * @value: defines the qos request
+ *
+ * This function inserts a new entry in the pm_qos_class list of requested qos
+ * performance characteristics.  It recomputes the aggregate QoS expectations
+ * for the pm_qos_class of parameters.
+ */
+int pm_qos_add_requirement(int pm_qos_class, char *name, s32 value)
+{
+       struct requirement_list *dep;
+       unsigned long flags;
+
+       dep = kzalloc(sizeof(struct requirement_list), GFP_KERNEL);
+       if (dep) {
+               if (value == PM_QOS_DEFAULT_VALUE)
+                       dep->value = pm_qos_array[pm_qos_class]->default_value;
+               else
+                       dep->value = value;
+               dep->name = kstrdup(name, GFP_KERNEL);
+               if (!dep->name)
+                       goto cleanup;
+
+               spin_lock_irqsave(&pm_qos_lock, flags);
+               list_add(&dep->list,
+                       &pm_qos_array[pm_qos_class]->requirements.list);
+               spin_unlock_irqrestore(&pm_qos_lock, flags);
+               update_target(pm_qos_class);
+
+               return 0;
+       }
+
+cleanup:
+       kfree(dep);
+       return -ENOMEM;
+}
+EXPORT_SYMBOL_GPL(pm_qos_add_requirement);
+
+/**
+ * pm_qos_update_requirement - modifies an existing qos request
+ * @pm_qos_class: identifies which list of qos request to us
+ * @name: identifies the request
+ * @value: defines the qos request
+ *
+ * Updates an existing qos requirement for the pm_qos_class of parameters along
+ * with updating the target pm_qos_class value.
+ *
+ * If the named request isn't in the list then no change is made.
+ */
+int pm_qos_update_requirement(int pm_qos_class, char *name, s32 new_value)
+{
+       unsigned long flags;
+       struct requirement_list *node;
+       int pending_update = 0;
+
+       spin_lock_irqsave(&pm_qos_lock, flags);
+       list_for_each_entry(node,
+               &pm_qos_array[pm_qos_class]->requirements.list, list) {
+               if (strcmp(node->name, name) == 0) {
+                       if (new_value == PM_QOS_DEFAULT_VALUE)
+                               node->value =
+                               pm_qos_array[pm_qos_class]->default_value;
+                       else
+                               node->value = new_value;
+                       pending_update = 1;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&pm_qos_lock, flags);
+       if (pending_update)
+               update_target(pm_qos_class);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(pm_qos_update_requirement);
+
+/**
+ * pm_qos_remove_requirement - modifies an existing qos request
+ * @pm_qos_class: identifies which list of qos request to us
+ * @name: identifies the request
+ *
+ * Will remove named qos request from pm_qos_class list of parameters and
+ * recompute the current target value for the pm_qos_class.
+ */
+void pm_qos_remove_requirement(int pm_qos_class, char *name)
+{
+       unsigned long flags;
+       struct requirement_list *node;
+       int pending_update = 0;
+
+       spin_lock_irqsave(&pm_qos_lock, flags);
+       list_for_each_entry(node,
+               &pm_qos_array[pm_qos_class]->requirements.list, list) {
+               if (strcmp(node->name, name) == 0) {
+                       kfree(node->name);
+                       list_del(&node->list);
+                       kfree(node);
+                       pending_update = 1;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&pm_qos_lock, flags);
+       if (pending_update)
+               update_target(pm_qos_class);
+}
+EXPORT_SYMBOL_GPL(pm_qos_remove_requirement);
+
+/**
+ * pm_qos_add_notifier - sets notification entry for changes to target value
+ * @pm_qos_class: identifies which qos target changes should be notified.
+ * @notifier: notifier block managed by caller.
+ *
+ * will register the notifier into a notification chain that gets called
+ * upon changes to the pm_qos_class target value.
+ */
+int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier)
+{
+       int retval;
+
+       retval = blocking_notifier_chain_register(
+                       pm_qos_array[pm_qos_class]->notifiers, notifier);
+
+       return retval;
+}
+EXPORT_SYMBOL_GPL(pm_qos_add_notifier);
+
+/**
+ * pm_qos_remove_notifier - deletes notification entry from chain.
+ * @pm_qos_class: identifies which qos target changes are notified.
+ * @notifier: notifier block to be removed.
+ *
+ * will remove the notifier from the notification chain that gets called
+ * upon changes to the pm_qos_class target value.
+ */
+int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier)
+{
+       int retval;
+
+       retval = blocking_notifier_chain_unregister(
+                       pm_qos_array[pm_qos_class]->notifiers, notifier);
+
+       return retval;
+}
+EXPORT_SYMBOL_GPL(pm_qos_remove_notifier);
+
+#define PID_NAME_LEN 32
+
+static int pm_qos_power_open(struct inode *inode, struct file *filp)
+{
+       int ret;
+       long pm_qos_class;
+       char name[PID_NAME_LEN];
+
+       pm_qos_class = find_pm_qos_object_by_minor(iminor(inode));
+       if (pm_qos_class >= 0) {
+               filp->private_data = (void *)pm_qos_class;
+               snprintf(name, PID_NAME_LEN, "process_%d", current->pid);
+               ret = pm_qos_add_requirement(pm_qos_class, name,
+                                       PM_QOS_DEFAULT_VALUE);
+               if (ret >= 0)
+                       return 0;
+       }
+       return -EPERM;
+}
+
+static int pm_qos_power_release(struct inode *inode, struct file *filp)
+{
+       int pm_qos_class;
+       char name[PID_NAME_LEN];
+
+       pm_qos_class = (long)filp->private_data;
+       snprintf(name, PID_NAME_LEN, "process_%d", current->pid);
+       pm_qos_remove_requirement(pm_qos_class, name);
+
+       return 0;
+}
+
+static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf,
+               size_t count, loff_t *f_pos)
+{
+       s32 value;
+       int pm_qos_class;
+       char name[PID_NAME_LEN];
+
+       pm_qos_class = (long)filp->private_data;
+       if (count != sizeof(s32))
+               return -EINVAL;
+       if (copy_from_user(&value, buf, sizeof(s32)))
+               return -EFAULT;
+       snprintf(name, PID_NAME_LEN, "process_%d", current->pid);
+       pm_qos_update_requirement(pm_qos_class, name, value);
+
+       return  sizeof(s32);
+}
+
+
+/*
+ * This initializes pm-qos for older kernels.
+ */
+int compat_pm_qos_power_init(void)
+{
+       int ret = 0;
+
+       ret = register_pm_qos_misc(&cpu_dma_pm_qos);
+       if (ret < 0) {
+               printk(KERN_ERR "pm_qos_param: cpu_dma_latency setup failed\n");
+               return ret;
+       }
+       ret = register_pm_qos_misc(&network_lat_pm_qos);
+       if (ret < 0) {
+               printk(KERN_ERR "pm_qos_param: network_latency setup failed\n");
+               return ret;
+       }
+       ret = register_pm_qos_misc(&network_throughput_pm_qos);
+       if (ret < 0) {
+               printk(KERN_ERR
+                       "pm_qos_param: network_throughput setup failed\n");
+               return ret;
+       }
+       ret = register_pm_qos_misc(&system_bus_freq_pm_qos);
+       if (ret < 0)
+               printk(KERN_ERR
+                       "pm_qos_param: system_bus_freq setup failed\n");
+
+       return ret;
+}
+
+int compat_pm_qos_power_deinit(void)
+{
+       int ret = 0;
+
+       ret = misc_deregister(&cpu_dma_pm_qos.pm_qos_power_miscdev);
+       if (ret < 0) {
+               printk(KERN_ERR "pm_qos_param: cpu_dma_latency deinit failed\n");
+               return ret;
+       }
+
+       ret = misc_deregister(&network_lat_pm_qos.pm_qos_power_miscdev);
+       if (ret < 0) {
+               printk(KERN_ERR "pm_qos_param: network_latency deinit failed\n");
+               return ret;
+       }
+
+       ret = misc_deregister(&network_throughput_pm_qos.pm_qos_power_miscdev);
+       if (ret < 0) {
+               printk(KERN_ERR
+                       "pm_qos_param: network_throughput deinit failed\n");
+               return ret;
+       }
+
+       ret = misc_deregister(&system_bus_freq_pm_qos.pm_qos_power_miscdev);
+       if (ret < 0) {
+               printk(KERN_ERR
+                       "pm_qos_param: system_bus_freq deinit failed\n");
+               return ret;
+       }
+
+       return ret;
+}
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) */
diff --git a/compat/scripts/compat_firmware_install b/compat/scripts/compat_firmware_install
new file mode 100755 (executable)
index 0000000..d92961a
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+if [ -f /usr/bin/lsb_release ]; then
+       LSB_RED_ID=$(/usr/bin/lsb_release -i -s)
+else
+       LSB_RED_ID="Unknown"
+fi
+
+case $LSB_RED_ID in
+"Ubuntu")
+       cp udev/ubuntu/compat_firmware.sh /lib/udev/
+       cp udev/ubuntu/50-compat_firmware.rules /lib/udev/rules.d/
+        ;;
+*)
+       cp udev/compat_firmware.sh /lib/udev/
+       cp udev/50-compat_firmware.rules /lib/udev/rules.d/
+        ;;
+esac
+
diff --git a/config.mk b/config.mk
new file mode 100644 (file)
index 0000000..5565e12
--- /dev/null
+++ b/config.mk
@@ -0,0 +1,468 @@
+export
+
+## NOTE
+## Make sure to have each variable declaration start
+## in the first column, no whitespace allowed.
+
+ifeq ($(wildcard $(KLIB_BUILD)/.config),)
+# These will be ignored by compat autoconf
+ CONFIG_PCI=y
+ CONFIG_USB=y
+ CONFIG_PCMCIA=y
+ CONFIG_SSB=m
+else
+include $(KLIB_BUILD)/.config
+endif
+
+# We will warn when you don't have MQ support or NET_SCHED enabled.
+#
+# We could consider just quiting if MQ and NET_SCHED is disabled
+# as I suspect all users of this package want 802.11e (WME) and
+# 802.11n (HT) support.
+ifneq ($(wildcard $(KLIB_BUILD)/Makefile),)
+COMPAT_LATEST_VERSION = 33
+KERNEL_SUBLEVEL := $(shell $(MAKE) -C $(KLIB_BUILD) kernelversion | sed -n 's/^2\.6\.\([0-9]\+\).*/\1/p')
+COMPAT_VERSIONS := $(shell I=$(COMPAT_LATEST_VERSION); while [ "$$I" -gt $(KERNEL_SUBLEVEL) ]; do echo $$I; I=$$(($$I - 1)); done)
+$(foreach ver,$(COMPAT_VERSIONS),$(eval CONFIG_COMPAT_KERNEL_$(ver)=y))
+
+ifdef CONFIG_COMPAT_KERNEL_25
+$(error "ERROR: compat-wireless by default supports kernels >= 2.6.25, try enabling only one driver though")
+endif
+
+ifeq ($(CONFIG_CFG80211),y)
+$(error "ERROR: your kernel has CONFIG_CFG80211=y, you should have it CONFIG_CFG80211=m if you want to use this thing.")
+endif
+
+
+# 2.6.27 has FTRACE_DYNAMIC borked, so we will complain if
+# you have it enabled, otherwise you will very likely run into
+# a kernel panic.
+ifeq ($(KERNEL_SUBLEVEL),27)
+ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
+$(error "ERROR: Your 2.6.27 kernel has CONFIG_DYNAMIC_FTRACE, please upgrade your distribution kernel as newer ones should not have this enabled (and if so report a bug) or remove this warning if you know what you are doing")
+endif
+endif
+
+# This is because with CONFIG_MAC80211 include/linux/skbuff.h will
+# enable on 2.6.27 a new attribute:
+#
+# skb->do_not_encrypt
+#
+# and on 2.6.28 another new attribute:
+#
+# skb->requeue
+#
+ifeq ($(shell test $(KERNEL_SUBLEVEL) -ge 27 && echo yes),yes)
+ifeq ($(CONFIG_MAC80211),)
+$(error "ERROR: Your >=2.6.27 kernel has CONFIG_MAC80211 disabled, you should have it CONFIG_MAC80211=m if you want to use this thing.")
+endif
+endif
+
+ifneq ($(KERNELRELEASE),) # This prevents a warning
+
+ifeq ($(CONFIG_NET_SCHED),)
+ QOS_REQS_MISSING+=CONFIG_NET_SCHED
+endif
+
+ifneq ($(QOS_REQS_MISSING),) # Complain about our missing dependencies
+$(warning "WARNING: You are running a kernel >= 2.6.23, you should enable in it $(QOS_REQS_MISSING) for 802.11[ne] support")
+endif
+
+endif # build check
+endif # kernel Makefile check
+
+# These both are needed by compat-wireless || compat-bluetooth so enable them
+ CONFIG_COMPAT_RFKILL=y
+
+ifeq ($(CONFIG_MAC80211),y)
+$(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular")
+else
+ CONFIG_COMPAT_WIRELESS=y
+ CONFIG_COMPAT_WIRELESS_MODULES=m
+ CONFIG_COMPAT_VAR_MODULES=m
+# We could technically separate these but not yet, we only have b44
+# Note that we don't intend on backporting network drivers that
+# use Multiqueue as that was a pain to backport to kernels older than
+# 2.6.27. But -- we could just disable those drivers from kernels
+# older than 2.6.27
+ CONFIG_COMPAT_NETWORK_MODULES=m
+ CONFIG_COMPAT_NET_USB_MODULES=m
+endif
+
+# The Bluetooth compatibility only builds on kernels >= 2.6.27 for now
+ifndef CONFIG_COMPAT_KERNEL_27
+ifeq ($(CONFIG_BT),y)
+# we'll ignore compiling bluetooth
+else
+ CONFIG_COMPAT_BLUETOOTH=y
+ CONFIG_COMPAT_BLUETOOTH_MODULES=m
+endif
+endif # Kernel >= 2.6.26
+
+ifeq ($(CONFIG_COMPAT_KERNEL_33),y)
+ifneq ($(CONFIG_FW_LOADER),)
+ CONFIG_COMPAT_FIRMWARE_CLASS=m
+endif
+endif
+
+
+# Wireless subsystem stuff
+CONFIG_MAC80211=m
+
+# CONFIG_MAC80211_DEBUGFS=y
+# CONFIG_MAC80211_DEBUG_MENU=y
+# CONFIG_MAC80211_NOINLINE=y
+# CONFIG_MAC80211_VERBOSE_DEBUG=y
+# CONFIG_MAC80211_HT_DEBUG=y
+# CONFIG_MAC80211_TKIP_DEBUG=y
+# CONFIG_MAC80211_IBSS_DEBUG=y
+# CONFIG_MAC80211_VERBOSE_PS_DEBUG=y
+# CONFIG_MAC80211_VERBOSE_MPL_DEBUG=y
+# CONFIG_MAC80211_VERBOSE_MHWMP_DEBUG=y
+# CONFIG_MAC80211_DEBUG_COUNTERS=y
+# CONFIG_MAC80211_DRIVER_API_TRACER=y
+
+# choose between pid and minstrel as default rate control algorithm
+CONFIG_MAC80211_RC_DEFAULT=minstrel
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+# CONFIG_MAC80211_RC_DEFAULT_PID=y
+# This is the one used by our compat-wireless net/mac80211/rate.c
+# in case you have and old kernel which is overriding this to pid.
+CONFIG_COMPAT_MAC80211_RC_DEFAULT=minstrel
+CONFIG_MAC80211_RC_PID=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_LEDS=y
+
+# enable mesh networking too
+CONFIG_MAC80211_MESH=y
+
+CONFIG_CFG80211=m
+CONFIG_CFG80211_DEFAULT_PS=y
+# CONFIG_CFG80211_DEBUGFS=y
+# CONFIG_NL80211_TESTMODE=y
+# CONFIG_CFG80211_DEVELOPER_WARNINGS=y
+# CONFIG_CFG80211_REG_DEBUG=y
+# See below for wext stuff
+
+CONFIG_LIB80211=m
+CONFIG_LIB80211_CRYPT_WEP=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+# CONFIG_LIB80211_DEBUG=y
+
+CONFIG_WIRELESS_OLD_REGULATORY=n
+
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_BNEP=m
+CONFIG_BT_ATH3K=m
+# CONFIG_BT_CMTP depends on ISDN_CAPI
+ifneq ($(CONFIG_BT_CMTP),)
+CONFIG_BT_CMTP=m
+endif
+CONFIG_BT_HIDP=m
+
+ifdef CONFIG_COMPAT_KERNEL_32
+# Old kernels stil do depend on CONFIG_WIRELESS_EXT
+# as we add the wireless handler back to the struct
+# netdevice
+ifneq ($(CONFIG_WIRELESS_EXT),)
+CONFIG_CFG80211_WEXT=y
+endif
+else
+# 2.6.33 and above do not need CONFIG_WIRELESS_EXT, but the
+# reality is we should select CONFIG_WIRELESS_EXT only if a
+# driver claims for it (one of the old non-cfg80211 drivers).
+# Then users could either have this on or off but we leave it
+# on in case users on >= 2.6.33 still have iwconfig and other
+# old deprecated userspace applications.
+CONFIG_CFG80211_WEXT=y
+endif # CONFIG_COMPAT_KERNEL_32
+
+# mac80211 test driver
+CONFIG_MAC80211_HWSIM=m
+
+# PCI Drivers
+ifneq ($(CONFIG_PCI),)
+
+CONFIG_ATH5K=m
+# CONFIG_ATH5K_DEBUG=y
+CONFIG_ATH9K_HW=m
+CONFIG_ATH9K=m
+# Note: once ath9k_htc is added we'll have to move
+# CONFIG_ATH9K_COMMON to an area that doesn't depend on PCI
+# as you could then have ath9k disabled but ath9k_htc enabled.
+CONFIG_ATH9K_COMMON=m
+# CONFIG_ATH9K_DEBUGFS=y
+
+
+CONFIG_IWLWIFI=m
+# CONFIG_IWLWIFI_DEBUG=y
+# CONFIG_IWLWIFI_DEBUGFS=y
+# CONFIG_IWLWIFI_DEVICE_TRACING=y
+CONFIG_IWLAGN=m
+CONFIG_COMPAT_IWL4965=y
+CONFIG_IWL5000=y
+CONFIG_IWL3945=m
+
+
+CONFIG_B43=m
+CONFIG_B43_HWRNG=y
+CONFIG_B43_PCI_AUTOSELECT=y
+ifneq ($(CONFIG_PCMCIA),)
+CONFIG_B43_PCMCIA=y
+endif
+CONFIG_B43_LEDS=y
+CONFIG_B43_PHY_LP=y
+CONFIG_B43_NPHY=y
+# CONFIG_B43_DEBUG=y
+
+CONFIG_B43LEGACY=m
+CONFIG_B43LEGACY_HWRNG=y
+CONFIG_B43LEGACY_PCI_AUTOSELECT=y
+CONFIG_B43LEGACY_LEDS=y
+# CONFIG_B43LEGACY_DEBUG=y
+CONFIG_B43LEGACY_DMA=y
+CONFIG_B43LEGACY_PIO=y
+
+# The Intel ipws
+CONFIG_LIBIPW=m
+# CONFIG_LIBIPW_DEBUG=y
+
+
+CONFIG_IPW2100=m
+CONFIG_IPW2100_MONITOR=y
+# CONFIG_IPW2100_DEBUG=y
+CONFIG_IPW2200=m
+CONFIG_IPW2200_MONITOR=y
+CONFIG_IPW2200_RADIOTAP=y
+CONFIG_IPW2200_PROMISCUOUS=y
+CONFIG_IPW2200_QOS=y
+# CONFIG_IPW2200_DEBUG=y
+# The above enables use a second interface prefixed 'rtap'.
+#           Example usage:
+#
+# % modprobe ipw2200 rtap_iface=1
+# % ifconfig rtap0 up
+# % tethereal -i rtap0
+#
+# If you do not specify 'rtap_iface=1' as a module parameter then
+# the rtap interface will not be created and you will need to turn
+# it on via sysfs:
+#
+# % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
+
+ifneq ($(CONFIG_SSB),)
+# Sonics Silicon Backplane
+CONFIG_SSB_SPROM=y
+# CONFIG_SSB_DEBUG=y
+
+CONFIG_SSB_BLOCKIO=y
+CONFIG_SSB_PCIHOST=y
+CONFIG_SSB_B43_PCI_BRIDGE=y
+ifneq ($(CONFIG_PCMCIA),)
+CONFIG_SSB_PCMCIAHOST=y
+endif
+# CONFIG_SSB_DEBUG=y
+CONFIG_SSB_DRIVER_PCICORE=y
+endif
+
+CONFIG_P54_PCI=m
+
+CONFIG_B44=m
+CONFIG_B44_PCI=y
+
+CONFIG_RTL8180=m
+
+CONFIG_ADM8211=m
+
+CONFIG_RT2X00_LIB_PCI=m
+CONFIG_RT2400PCI=m
+CONFIG_RT2500PCI=m
+CONFIG_RT2800PCI=m
+CONFIG_RT2800PCI_PCI=y
+NEED_RT2X00=y
+
+# Two rt2x00 drivers require firmware: rt61pci and rt73usb. They depend on
+# CRC to check the firmware. We check here first for the PCI
+# driver as we're in the PCI section.
+ifneq ($(CONFIG_CRC_ITU_T),)
+CONFIG_RT61PCI=m
+NEED_RT2X00_FIRMWARE=y
+endif
+
+CONFIG_MWL8K=m
+
+# Ethernet drivers go here
+CONFIG_ATL1=m
+CONFIG_ATL2=m
+CONFIG_ATL1E=m
+CONFIG_ATL1C=m
+
+endif
+## end of PCI
+
+ifneq ($(CONFIG_PCMCIA),)
+
+ifdef CONFIG_COMPAT_KERNEL_27
+CONFIG_LIBERTAS=n
+CONFIG_LIBERTAS_CS=n
+else
+CONFIG_LIBERTAS_CS=m
+NEED_LIBERTAS=y
+endif
+
+endif
+## end of PCMCIA
+
+# This is required for some cards
+CONFIG_EEPROM_93CX6=m
+
+# USB Drivers
+ifneq ($(CONFIG_USB),)
+CONFIG_ZD1211RW=m
+# CONFIG_ZD1211RW_DEBUG=y
+
+# Sorry, rndis_wlan uses cancel_work_sync which is new and can't be done in compat...
+
+# Wireless RNDIS USB support (RTL8185 802.11g) A-Link WL54PC
+# All of these devices are based on Broadcom 4320 chip which
+# is only wireless RNDIS chip known to date.
+# Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER
+# it also requires new RNDIS_HOST and CDC_ETHER modules which we add
+ifdef CONFIG_COMPAT_KERNEL_29
+CONFIG_USB_COMPAT_USBNET=n
+CONFIG_USB_NET_COMPAT_RNDIS_HOST=n
+CONFIG_USB_NET_COMPAT_RNDIS_WLAN=n
+CONFIG_USB_NET_COMPAT_CDCETHER=n
+else
+CONFIG_USB_COMPAT_USBNET=m
+CONFIG_USB_NET_COMPAT_RNDIS_HOST=m
+CONFIG_USB_NET_COMPAT_RNDIS_WLAN=m
+CONFIG_USB_NET_COMPAT_CDCETHER=m
+endif
+
+
+CONFIG_P54_USB=m
+CONFIG_RTL8187=m
+CONFIG_RTL8187_LEDS=y
+
+CONFIG_AT76C50X_USB=m
+
+ifndef CONFIG_COMPAT_KERNEL_28
+CONFIG_AR9170_USB=m
+CONFIG_AR9170_LEDS=y
+endif
+
+# RT2500USB does not require firmware
+CONFIG_RT2500USB=m
+CONFIG_RT2800USB=m
+CONFIG_RT2X00_LIB_USB=m
+NEED_RT2X00=y
+# RT73USB requires firmware
+ifneq ($(CONFIG_CRC_ITU_T),)
+CONFIG_RT73USB=m
+NEED_RT2X00_FIRMWARE=y
+endif
+
+ifdef CONFIG_COMPAT_KERNEL_27
+CONFIG_LIBERTAS_THINFIRM_USB=n
+CONFIG_LIBERTAS_USB=n
+NEED_LIBERTAS=n
+else
+CONFIG_LIBERTAS_THINFIRM_USB=m
+CONFIG_LIBERTAS_USB=m
+NEED_LIBERTAS=y
+endif
+
+endif # end of USB driver list
+
+ifneq ($(CONFIG_SPI_MASTER),)
+
+CONFIG_WL1251=m
+CONFIG_WL1251_SPI=m
+CONFIG_P54_SPI=m
+
+ifdef CONFIG_COMPAT_KERNEL_27
+CONFIG_LIBERTAS_SPI=n
+NEED_LIBERTAS=n
+else
+CONFIG_LIBERTAS_SPI=m
+NEED_LIBERTAS=y
+endif
+
+endif # end of SPI driver list
+
+ifneq ($(CONFIG_MMC),)
+
+CONFIG_SSB_SDIOHOST=y
+CONFIG_B43_SDIO=y
+CONFIG_WL1251_SDIO=m
+
+ifdef CONFIG_COMPAT_KERNEL_27
+CONFIG_LIBERTAS_SDIO=n
+NEED_LIBERTAS=n
+else
+CONFIG_LIBERTAS_SDIO=m
+NEED_LIBERTAS=y
+endif
+
+# Activate iwmc3200wifi support only on kernel >= 2.6.29.
+# iwmc3200wifi uses new netdev_ops api no supported by old kernel.
+ifndef CONFIG_COMPAT_KERNEL_29
+CONFIG_IWM=m
+# CONFIG_IWM_DEBUG=y
+endif
+
+endif # end of SDIO driver list
+
+# Common rt2x00 requirements
+ifeq ($(NEED_RT2X00),y)
+CONFIG_RT2X00=y
+CONFIG_RT2X00_LIB=m
+CONFIG_RT2800_LIB=m
+CONFIG_RT2X00_LIB_HT=y
+CONFIG_RT2X00_LIB_FIRMWARE=y
+CONFIG_RT2X00_LIB_CRYPTO=y
+CONFIG_RT2X00_LIB_LEDS=y
+# CONFIG_RT2X00_DEBUG=y
+# CONFIG_RT2X00_LIB_DEBUGFS
+endif
+
+ifeq ($(NEED_RT2X00_FIRMWARE),y)
+CONFIG_RT2X00_LIB_FIRMWARE=y
+endif
+
+# p54
+CONFIG_P54_COMMON=m
+CONFIG_P54_LEDS=y
+
+# Atheros
+CONFIG_ATH_COMMON=m
+# CONFIG_ATH_DEBUG=y
+
+CONFIG_WL12XX=y
+CONFIG_WL1251=m
+CONFIG_WL1271=m
+
+ifdef CONFIG_COMPAT_KERNEL_27
+CONFIG_LIBERTAS=n
+else
+ifeq ($(NEED_LIBERTAS),y)
+CONFIG_LIBERTAS_THINFIRM=m
+CONFIG_LIBERTAS=m
+CONFIG_LIBERTAS_MESH=y
+# CONFIG_LIBERTAS_DEBUG=y
+endif
+endif
+
+# We need the backported rfkill module on kernel < 2.6.31.
+# In more recent kernel versions use the in kernel rfkill module.
+ifdef CONFIG_COMPAT_KERNEL_31
+CONFIG_RFKILL_BACKPORT=m
+CONFIG_RFKILL_BACKPORT_LEDS=y
+CONFIG_RFKILL_BACKPORT_INPUT=y
+endif
+
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
new file mode 100644 (file)
index 0000000..7e5aed5
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# Makefile for the Linux Bluetooth HCI device drivers.
+#
+
+obj-$(CONFIG_BT_HCIVHCI)       += hci_vhci.o
+obj-$(CONFIG_BT_HCIUART)       += hci_uart.o
+obj-$(CONFIG_BT_HCIBCM203X)    += bcm203x.o
+obj-$(CONFIG_BT_HCIBPA10X)     += bpa10x.o
+obj-$(CONFIG_BT_HCIBFUSB)      += bfusb.o
+obj-$(CONFIG_BT_HCIDTL1)       += dtl1_cs.o
+obj-$(CONFIG_BT_HCIBT3C)       += bt3c_cs.o
+obj-$(CONFIG_BT_HCIBLUECARD)   += bluecard_cs.o
+obj-$(CONFIG_BT_HCIBTUART)     += btuart_cs.o
+
+obj-$(CONFIG_BT_HCIBTUSB)      += btusb.o
+obj-$(CONFIG_BT_HCIBTSDIO)     += btsdio.o
+
+obj-$(CONFIG_BT_ATH3K)         += ath3k.o
+obj-$(CONFIG_BT_MRVL)          += btmrvl.o
+obj-$(CONFIG_BT_MRVL_SDIO)     += btmrvl_sdio.o
+
+btmrvl-y                       := btmrvl_main.o
+btmrvl-$(CONFIG_DEBUG_FS)      += btmrvl_debugfs.o
+
+hci_uart-y                             := hci_ldisc.o
+hci_uart-$(CONFIG_BT_HCIUART_H4)       += hci_h4.o
+hci_uart-$(CONFIG_BT_HCIUART_BCSP)     += hci_bcsp.o
+hci_uart-$(CONFIG_BT_HCIUART_LL)       += hci_ll.o
+hci_uart-objs                          := $(hci_uart-y)
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
new file mode 100644 (file)
index 0000000..128cae4
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2008-2009 Atheros Communications Inc.
+ *
+ *  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.
+ *
+ *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/device.h>
+#include <linux/firmware.h>
+#include <linux/usb.h>
+#include <net/bluetooth/bluetooth.h>
+
+#define VERSION "1.0"
+
+
+static struct usb_device_id ath3k_table[] = {
+       /* Atheros AR3011 */
+       { USB_DEVICE(0x0CF3, 0x3000) },
+       { }     /* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, ath3k_table);
+
+#define USB_REQ_DFU_DNLOAD     1
+#define BULK_SIZE              4096
+
+struct ath3k_data {
+       struct usb_device *udev;
+       u8 *fw_data;
+       u32 fw_size;
+       u32 fw_sent;
+};
+
+static int ath3k_load_firmware(struct ath3k_data *data,
+                               unsigned char *firmware,
+                               int count)
+{
+       u8 *send_buf;
+       int err, pipe, len, size, sent = 0;
+
+       BT_DBG("ath3k %p udev %p", data, data->udev);
+
+       pipe = usb_sndctrlpipe(data->udev, 0);
+
+       if ((usb_control_msg(data->udev, pipe,
+                               USB_REQ_DFU_DNLOAD,
+                               USB_TYPE_VENDOR, 0, 0,
+                               firmware, 20, USB_CTRL_SET_TIMEOUT)) < 0) {
+               BT_ERR("Can't change to loading configuration err");
+               return -EBUSY;
+       }
+       sent += 20;
+       count -= 20;
+
+       send_buf = kmalloc(BULK_SIZE, GFP_ATOMIC);
+       if (!send_buf) {
+               BT_ERR("Can't allocate memory chunk for firmware");
+               return -ENOMEM;
+       }
+
+       while (count) {
+               size = min_t(uint, count, BULK_SIZE);
+               pipe = usb_sndbulkpipe(data->udev, 0x02);
+               memcpy(send_buf, firmware + sent, size);
+
+               err = usb_bulk_msg(data->udev, pipe, send_buf, size,
+                                       &len, 3000);
+
+               if (err || (len != size)) {
+                       BT_ERR("Error in firmware loading err = %d,"
+                               "len = %d, size = %d", err, len, size);
+                       goto error;
+               }
+
+               sent  += size;
+               count -= size;
+       }
+
+       kfree(send_buf);
+       return 0;
+
+error:
+       kfree(send_buf);
+       return err;
+}
+
+static int ath3k_probe(struct usb_interface *intf,
+                       const struct usb_device_id *id)
+{
+       const struct firmware *firmware;
+       struct usb_device *udev = interface_to_usbdev(intf);
+       struct ath3k_data *data;
+       int size;
+
+       BT_DBG("intf %p id %p", intf, id);
+
+       if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
+               return -ENODEV;
+
+       data = kzalloc(sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       data->udev = udev;
+
+       if (request_firmware(&firmware, "ath3k-1.fw", &udev->dev) < 0) {
+               kfree(data);
+               return -EIO;
+       }
+
+       size = max_t(uint, firmware->size, 4096);
+       data->fw_data = kmalloc(size, GFP_KERNEL);
+       if (!data->fw_data) {
+               release_firmware(firmware);
+               kfree(data);
+               return -ENOMEM;
+       }
+
+       memcpy(data->fw_data, firmware->data, firmware->size);
+       data->fw_size = firmware->size;
+       data->fw_sent = 0;
+       release_firmware(firmware);
+
+       usb_set_intfdata(intf, data);
+       if (ath3k_load_firmware(data, data->fw_data, data->fw_size)) {
+               usb_set_intfdata(intf, NULL);
+               kfree(data->fw_data);
+               kfree(data);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static void ath3k_disconnect(struct usb_interface *intf)
+{
+       struct ath3k_data *data = usb_get_intfdata(intf);
+
+       BT_DBG("ath3k_disconnect intf %p", intf);
+
+       kfree(data->fw_data);
+       kfree(data);
+}
+
+static struct usb_driver ath3k_driver = {
+       .name           = "ath3k",
+       .probe          = ath3k_probe,
+       .disconnect     = ath3k_disconnect,
+       .id_table       = ath3k_table,
+};
+
+static int __init ath3k_init(void)
+{
+       BT_INFO("Atheros AR30xx firmware driver ver %s", VERSION);
+       return usb_register(&ath3k_driver);
+}
+
+static void __exit ath3k_exit(void)
+{
+       usb_deregister(&ath3k_driver);
+}
+
+module_init(ath3k_init);
+module_exit(ath3k_exit);
+
+MODULE_AUTHOR("Atheros Communications");
+MODULE_DESCRIPTION("Atheros AR30xx firmware driver");
+MODULE_VERSION(VERSION);
+MODULE_LICENSE("GPL");
+MODULE_FIRMWARE("ath3k-1.fw");
diff --git a/drivers/bluetooth/bcm203x.c b/drivers/bluetooth/bcm203x.c
new file mode 100644 (file)
index 0000000..b0c84c1
--- /dev/null
@@ -0,0 +1,301 @@
+/*
+ *
+ *  Broadcom Blutonium firmware driver
+ *
+ *  Copyright (C) 2003  Maxim Krasnyansky <maxk@qualcomm.com>
+ *  Copyright (C) 2003  Marcel Holtmann <marcel@holtmann.org>
+ *
+ *
+ *  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.
+ *
+ *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+
+#include <linux/device.h>
+#include <linux/firmware.h>
+
+#include <linux/usb.h>
+
+#include <net/bluetooth/bluetooth.h>
+
+#define VERSION "1.2"
+
+static const struct usb_device_id bcm203x_table[] = {
+       /* Broadcom Blutonium (BCM2033) */
+       { USB_DEVICE(0x0a5c, 0x2033) },
+
+       { }     /* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, bcm203x_table);
+
+#define BCM203X_ERROR          0
+#define BCM203X_RESET          1
+#define BCM203X_LOAD_MINIDRV   2
+#define BCM203X_SELECT_MEMORY  3
+#define BCM203X_CHECK_MEMORY   4
+#define BCM203X_LOAD_FIRMWARE  5
+#define BCM203X_CHECK_FIRMWARE 6
+
+#define BCM203X_IN_EP          0x81
+#define BCM203X_OUT_EP         0x02
+
+struct bcm203x_data {
+       struct usb_device       *udev;
+
+       unsigned long           state;
+
+       struct work_struct      work;
+
+       struct urb              *urb;
+       unsigned char           *buffer;
+
+       unsigned char           *fw_data;
+       unsigned int            fw_size;
+       unsigned int            fw_sent;
+};
+
+static void bcm203x_complete(struct urb *urb)
+{
+       struct bcm203x_data *data = urb->context;
+       struct usb_device *udev = urb->dev;
+       int len;
+
+       BT_DBG("udev %p urb %p", udev, urb);
+
+       if (urb->status) {
+               BT_ERR("URB failed with status %d", urb->status);
+               data->state = BCM203X_ERROR;
+               return;
+       }
+
+       switch (data->state) {
+       case BCM203X_LOAD_MINIDRV:
+    &nbs