Commit 55faed1e authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

parents 946e91f3 0edd5b44
...@@ -2058,6 +2058,13 @@ config BNX2 ...@@ -2058,6 +2058,13 @@ config BNX2
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called bnx2. This is recommended. will be called bnx2. This is recommended.
config SPIDER_NET
tristate "Spider Gigabit Ethernet driver"
depends on PCI && PPC_BPA
help
This driver supports the Gigabit Ethernet chips present on the
Cell Processor-Based Blades from IBM.
config GIANFAR config GIANFAR
tristate "Gianfar Ethernet" tristate "Gianfar Ethernet"
depends on 85xx || 83xx depends on 85xx || 83xx
......
...@@ -54,6 +54,8 @@ obj-$(CONFIG_STNIC) += stnic.o 8390.o ...@@ -54,6 +54,8 @@ obj-$(CONFIG_STNIC) += stnic.o 8390.o
obj-$(CONFIG_FEALNX) += fealnx.o obj-$(CONFIG_FEALNX) += fealnx.o
obj-$(CONFIG_TIGON3) += tg3.o obj-$(CONFIG_TIGON3) += tg3.o
obj-$(CONFIG_BNX2) += bnx2.o obj-$(CONFIG_BNX2) += bnx2.o
spidernet-y += spider_net.o spider_net_ethtool.o sungem_phy.o
obj-$(CONFIG_SPIDER_NET) += spidernet.o
obj-$(CONFIG_TC35815) += tc35815.o obj-$(CONFIG_TC35815) += tc35815.o
obj-$(CONFIG_SKGE) += skge.o obj-$(CONFIG_SKGE) += skge.o
obj-$(CONFIG_SK98LIN) += sk98lin/ obj-$(CONFIG_SK98LIN) += sk98lin/
......
...@@ -275,7 +275,7 @@ static int __init ac_probe1(int ioaddr, struct net_device *dev) ...@@ -275,7 +275,7 @@ static int __init ac_probe1(int ioaddr, struct net_device *dev)
return 0; return 0;
out2: out2:
if (ei_status.reg0) if (ei_status.reg0)
iounmap((void *)dev->mem_start); iounmap(ei_status.mem);
out1: out1:
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
out: out:
......
...@@ -235,7 +235,7 @@ struct lance_private { ...@@ -235,7 +235,7 @@ struct lance_private {
#define MEM lp->mem #define MEM lp->mem
#define DREG IO->data #define DREG IO->data
#define AREG IO->addr #define AREG IO->addr
#define REGA(a) ( AREG = (a), DREG ) #define REGA(a) (*( AREG = (a), &DREG ))
/* Definitions for packet buffer access: */ /* Definitions for packet buffer access: */
#define PKT_BUF_SZ 1544 #define PKT_BUF_SZ 1544
......
...@@ -1140,7 +1140,7 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value) ...@@ -1140,7 +1140,7 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
} }
static int static int
dm9000_drv_suspend(struct device *dev, u32 state, u32 level) dm9000_drv_suspend(struct device *dev, pm_message_t state, u32 level)
{ {
struct net_device *ndev = dev_get_drvdata(dev); struct net_device *ndev = dev_get_drvdata(dev);
......
...@@ -1372,7 +1372,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) ...@@ -1372,7 +1372,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
/* synchronized against open : rtnl_lock() held by caller */ /* synchronized against open : rtnl_lock() held by caller */
if (netif_running(dev)) { if (netif_running(dev)) {
u8 *base = get_hwbase(dev); u8 __iomem *base = get_hwbase(dev);
/* /*
* It seems that the nic preloads valid ring entries into an * It seems that the nic preloads valid ring entries into an
* internal buffer. The procedure for flushing everything is * internal buffer. The procedure for flushing everything is
...@@ -1423,7 +1423,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) ...@@ -1423,7 +1423,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
static void nv_copy_mac_to_hw(struct net_device *dev) static void nv_copy_mac_to_hw(struct net_device *dev)
{ {
u8 *base = get_hwbase(dev); u8 __iomem *base = get_hwbase(dev);
u32 mac[2]; u32 mac[2];
mac[0] = (dev->dev_addr[0] << 0) + (dev->dev_addr[1] << 8) + mac[0] = (dev->dev_addr[0] << 0) + (dev->dev_addr[1] << 8) +
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* Copyright (C) 2001 Kyle A. Lucke (klucke@us.ibm.com), IBM Corp. * Copyright (C) 2001 Kyle A. Lucke (klucke@us.ibm.com), IBM Corp.
* Substantially cleaned up by: * Substantially cleaned up by:
* Copyright (C) 2003 David Gibson <dwg@au1.ibm.com>, IBM Corporation. * Copyright (C) 2003 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
* Copyright (C) 2004-2005 Michael Ellerman, IBM Corporation.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as * modify it under the terms of the GNU General Public License as
......
/************************************************************************ /************************************************************************
* regs.h: A Linux PCI-X Ethernet driver for S2IO 10GbE Server NIC * regs.h: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC
* Copyright(c) 2002-2005 Neterion Inc. * Copyright(c) 2002-2005 Neterion Inc.
* This software may be used and distributed according to the terms of * This software may be used and distributed according to the terms of
...@@ -713,13 +713,16 @@ typedef struct _XENA_dev_config { ...@@ -713,13 +713,16 @@ typedef struct _XENA_dev_config {
u64 mc_err_reg; u64 mc_err_reg;
#define MC_ERR_REG_ECC_DB_ERR_L BIT(14) #define MC_ERR_REG_ECC_DB_ERR_L BIT(14)
#define MC_ERR_REG_ECC_DB_ERR_U BIT(15) #define MC_ERR_REG_ECC_DB_ERR_U BIT(15)
#define MC_ERR_REG_MIRI_ECC_DB_ERR_0 BIT(18)
#define MC_ERR_REG_MIRI_ECC_DB_ERR_1 BIT(20)
#define MC_ERR_REG_MIRI_CRI_ERR_0 BIT(22) #define MC_ERR_REG_MIRI_CRI_ERR_0 BIT(22)
#define MC_ERR_REG_MIRI_CRI_ERR_1 BIT(23) #define MC_ERR_REG_MIRI_CRI_ERR_1 BIT(23)
#define MC_ERR_REG_SM_ERR BIT(31) #define MC_ERR_REG_SM_ERR BIT(31)
#define MC_ERR_REG_ECC_ALL_SNG (BIT(6) | \ #define MC_ERR_REG_ECC_ALL_SNG (BIT(2) | BIT(3) | BIT(4) | BIT(5) |\
BIT(7) | BIT(17) | BIT(19)) BIT(6) | BIT(7) | BIT(17) | BIT(19))
#define MC_ERR_REG_ECC_ALL_DBL (BIT(14) | \ #define MC_ERR_REG_ECC_ALL_DBL (BIT(10) | BIT(11) | BIT(12) |\
BIT(15) | BIT(18) | BIT(20)) BIT(13) | BIT(14) | BIT(15) |\
BIT(18) | BIT(20))
u64 mc_err_mask; u64 mc_err_mask;
u64 mc_err_alarm; u64 mc_err_alarm;
......
/************************************************************************ /************************************************************************
* s2io.c: A Linux PCI-X Ethernet driver for S2IO 10GbE Server NIC * s2io.c: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC
* Copyright(c) 2002-2005 Neterion Inc. * Copyright(c) 2002-2005 Neterion Inc.
* This software may be used and distributed according to the terms of * This software may be used and distributed according to the terms of
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
* explaination of all the variables. * explaination of all the variables.
* rx_ring_num : This can be used to program the number of receive rings used * rx_ring_num : This can be used to program the number of receive rings used
* in the driver. * in the driver.
* rx_ring_len: This defines the number of descriptors each ring can have. This * rx_ring_sz: This defines the number of descriptors each ring can have. This
* is also an array of size 8. * is also an array of size 8.
* tx_fifo_num: This defines the number of Tx FIFOs thats used int the driver. * tx_fifo_num: This defines the number of Tx FIFOs thats used int the driver.
* tx_fifo_len: This too is an array of 8. Each element defines the number of * tx_fifo_len: This too is an array of 8. Each element defines the number of
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
/* S2io Driver name & version. */ /* S2io Driver name & version. */
static char s2io_driver_name[] = "Neterion"; static char s2io_driver_name[] = "Neterion";
static char s2io_driver_version[] = "Version 2.0.3.1"; static char s2io_driver_version[] = "Version 2.0.8.1";
static inline int RXD_IS_UP2DT(RxD_t *rxdp) static inline int RXD_IS_UP2DT(RxD_t *rxdp)
{ {
...@@ -404,7 +404,7 @@ static int init_shared_mem(struct s2io_nic *nic) ...@@ -404,7 +404,7 @@ static int init_shared_mem(struct s2io_nic *nic)
config->tx_cfg[i].fifo_len - 1; config->tx_cfg[i].fifo_len - 1;
mac_control->fifos[i].fifo_no = i; mac_control->fifos[i].fifo_no = i;
mac_control->fifos[i].nic = nic; mac_control->fifos[i].nic = nic;
mac_control->fifos[i].max_txds = MAX_SKB_FRAGS; mac_control->fifos[i].max_txds = MAX_SKB_FRAGS + 1;
for (j = 0; j < page_num; j++) { for (j = 0; j < page_num; j++) {
int k = 0; int k = 0;
...@@ -418,6 +418,26 @@ static int init_shared_mem(struct s2io_nic *nic) ...@@ -418,6 +418,26 @@ static int init_shared_mem(struct s2io_nic *nic)
DBG_PRINT(ERR_DBG, "failed for TxDL\n"); DBG_PRINT(ERR_DBG, "failed for TxDL\n");
return -ENOMEM; return -ENOMEM;
} }
/* If we got a zero DMA address(can happen on
* certain platforms like PPC), reallocate.
* Store virtual address of page we don't want,
* to be freed later.
*/
if (!tmp_p) {
mac_control->zerodma_virt_addr = tmp_v;
DBG_PRINT(INIT_DBG,
"%s: Zero DMA address for TxDL. ", dev->name);
DBG_PRINT(INIT_DBG,
"Virtual address %llx\n", (u64)tmp_v);
tmp_v = pci_alloc_consistent(nic->pdev,
PAGE_SIZE, &tmp_p);
if (!tmp_v) {
DBG_PRINT(ERR_DBG,
"pci_alloc_consistent ");
DBG_PRINT(ERR_DBG, "failed for TxDL\n");
return -ENOMEM;
}
}
while (k < lst_per_page) { while (k < lst_per_page) {
int l = (j * lst_per_page) + k; int l = (j * lst_per_page) + k;
if (l == config->tx_cfg[i].fifo_len) if (l == config->tx_cfg[i].fifo_len)
...@@ -600,7 +620,7 @@ static void free_shared_mem(struct s2io_nic *nic) ...@@ -600,7 +620,7 @@ static void free_shared_mem(struct s2io_nic *nic)
mac_info_t *mac_control; mac_info_t *mac_control;
struct config_param *config; struct config_param *config;
int lst_size, lst_per_page; int lst_size, lst_per_page;
struct net_device *dev = nic->dev;
if (!nic) if (!nic)
return; return;
...@@ -616,9 +636,10 @@ static void free_shared_mem(struct s2io_nic *nic) ...@@ -616,9 +636,10 @@ static void free_shared_mem(struct s2io_nic *nic)
lst_per_page); lst_per_page);
for (j = 0; j < page_num; j++) { for (j = 0; j < page_num; j++) {
int mem_blks = (j * lst_per_page); int mem_blks = (j * lst_per_page);
if ((!mac_control->fifos[i].list_info) || if (!mac_control->fifos[i].list_info)
(!mac_control->fifos[i].list_info[mem_blks]. return;
list_virt_addr)) if (!mac_control->fifos[i].list_info[mem_blks].
list_virt_addr)
break; break;
pci_free_consistent(nic->pdev, PAGE_SIZE, pci_free_consistent(nic->pdev, PAGE_SIZE,
mac_control->fifos[i]. mac_control->fifos[i].
...@@ -628,6 +649,18 @@ static void free_shared_mem(struct s2io_nic *nic) ...@@ -628,6 +649,18 @@ static void free_shared_mem(struct s2io_nic *nic)
list_info[mem_blks]. list_info[mem_blks].
list_phy_addr); list_phy_addr);
} }
/* If we got a zero DMA address during allocation,
* free the page now
*/
if (mac_control->zerodma_virt_addr) {
pci_free_consistent(nic->pdev, PAGE_SIZE,
mac_control->zerodma_virt_addr,
(dma_addr_t)0);
DBG_PRINT(INIT_DBG,
"%s: Freeing TxDL with zero DMA addr. ", dev->name);
DBG_PRINT(INIT_DBG, "Virtual address %llx\n",
(u64)(mac_control->zerodma_virt_addr));
}
kfree(mac_control->fifos[i].list_info); kfree(mac_control->fifos[i].list_info);
} }
...@@ -2479,9 +2512,10 @@ static void rx_intr_handler(ring_info_t *ring_data) ...@@ -2479,9 +2512,10 @@ static void rx_intr_handler(ring_info_t *ring_data)
#endif #endif
spin_lock(&nic->rx_lock); spin_lock(&nic->rx_lock);
if (atomic_read(&nic->card_state) == CARD_DOWN) { if (atomic_read(&nic->card_state) == CARD_DOWN) {
DBG_PRINT(ERR_DBG, "%s: %s going down for reset\n", DBG_PRINT(INTR_DBG, "%s: %s going down for reset\n",
__FUNCTION__, dev->name); __FUNCTION__, dev->name);
spin_unlock(&nic->rx_lock); spin_unlock(&nic->rx_lock);
return;
} }
get_info = ring_data->rx_curr_get_info; get_info = ring_data->rx_curr_get_info;
...@@ -2596,8 +2630,14 @@ static void tx_intr_handler(fifo_info_t *fifo_data) ...@@ -2596,8 +2630,14 @@ static void tx_intr_handler(fifo_info_t *fifo_data)
if (txdlp->Control_1 & TXD_T_CODE) { if (txdlp->Control_1 & TXD_T_CODE) {
unsigned long long err; unsigned long long err;
err = txdlp->Control_1 & TXD_T_CODE; err = txdlp->Control_1 & TXD_T_CODE;
DBG_PRINT(ERR_DBG, "***TxD error %llx\n", if ((err >> 48) == 0xA) {
err); DBG_PRINT(TX_DBG, "TxD returned due \
to loss of link\n");
}
else {
DBG_PRINT(ERR_DBG, "***TxD error \
%llx\n", err);
}
} }
skb = (struct sk_buff *) ((unsigned long) skb = (struct sk_buff *) ((unsigned long)
...@@ -2689,12 +2729,16 @@ static void alarm_intr_handler(struct s2io_nic *nic) ...@@ -2689,12 +2729,16 @@ static void alarm_intr_handler(struct s2io_nic *nic)
if (val64 & MC_ERR_REG_ECC_ALL_DBL) { if (val64 & MC_ERR_REG_ECC_ALL_DBL) {
nic->mac_control.stats_info->sw_stat. nic->mac_control.stats_info->sw_stat.
double_ecc_errs++; double_ecc_errs++;
DBG_PRINT(ERR_DBG, "%s: Device indicates ", DBG_PRINT(INIT_DBG, "%s: Device indicates ",
dev->name); dev->name);
DBG_PRINT(ERR_DBG, "double ECC error!!\n"); DBG_PRINT(INIT_DBG, "double ECC error!!\n");
if (nic->device_type != XFRAME_II_DEVICE) { if (nic->device_type != XFRAME_II_DEVICE) {
netif_stop_queue(dev); /* Reset XframeI only if critical error */
schedule_work(&nic->rst_timer_task); if (val64 & (MC_ERR_REG_MIRI_ECC_DB_ERR_0 |
MC_ERR_REG_MIRI_ECC_DB_ERR_1)) {
netif_stop_queue(dev);
schedule_work(&nic->rst_timer_task);
}
} }
} else { } else {
nic->mac_control.stats_info->sw_stat. nic->mac_control.stats_info->sw_stat.
...@@ -2706,7 +2750,8 @@ static void alarm_intr_handler(struct s2io_nic *nic) ...@@ -2706,7 +2750,8 @@ static void alarm_intr_handler(struct s2io_nic *nic)
val64 = readq(&bar0->serr_source); val64 = readq(&bar0->serr_source);
if (val64 & SERR_SOURCE_ANY) { if (val64 & SERR_SOURCE_ANY) {
DBG_PRINT(ERR_DBG, "%s: Device indicates ", dev->name); DBG_PRINT(ERR_DBG, "%s: Device indicates ", dev->name);
DBG_PRINT(ERR_DBG, "serious error!!\n"); DBG_PRINT(ERR_DBG, "serious error %llx!!\n",
(unsigned long long)val64);
netif_stop_queue(dev); netif_stop_queue(dev);
schedule_work(&nic->rst_timer_task); schedule_work(&nic->rst_timer_task);
} }
...@@ -3130,7 +3175,7 @@ int s2io_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -3130,7 +3175,7 @@ int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
queue_len = mac_control->fifos[queue].tx_curr_put_info.fifo_len + 1; queue_len = mac_control->fifos[queue].tx_curr_put_info.fifo_len + 1;
/* Avoid "put" pointer going beyond "get" pointer */ /* Avoid "put" pointer going beyond "get" pointer */
if (txdp->Host_Control || (((put_off + 1) % queue_len) == get_off)) { if (txdp->Host_Control || (((put_off + 1) % queue_len) == get_off)) {
DBG_PRINT(ERR_DBG, "Error in xmit, No free TXDs.\n"); DBG_PRINT(TX_DBG, "Error in xmit, No free TXDs.\n");
netif_stop_queue(dev); netif_stop_queue(dev);
dev_kfree_skb(skb); dev_kfree_skb(skb);
spin_unlock_irqrestore(&sp->tx_lock, flags); spin_unlock_irqrestore(&sp->tx_lock, flags);
...@@ -3528,7 +3573,7 @@ static void s2io_set_multicast(struct net_device *dev) ...@@ -3528,7 +3573,7 @@ static void s2io_set_multicast(struct net_device *dev)
val64 = readq(&bar0->mac_cfg); val64 = readq(&bar0->mac_cfg);
sp->promisc_flg = 1; sp->promisc_flg = 1;
DBG_PRINT(ERR_DBG, "%s: entered promiscuous mode\n", DBG_PRINT(INFO_DBG, "%s: entered promiscuous mode\n",
dev->name); dev->name);
} else if (!(dev->flags & IFF_PROMISC) && (sp->promisc_flg)) { } else if (!(dev->flags & IFF_PROMISC) && (sp->promisc_flg)) {
/* Remove the NIC from promiscuous mode */ /* Remove the NIC from promiscuous mode */
...@@ -3543,7 +3588,7 @@ static void s2io_set_multicast(struct net_device *dev) ...@@ -3543,7 +3588,7 @@ static void s2io_set_multicast(struct net_device *dev)
val64 = readq(&bar0->mac_cfg); val64 = readq(&bar0->mac_cfg);
sp->promisc_flg = 0; sp->promisc_flg = 0;
DBG_PRINT(ERR_DBG, "%s: left promiscuous mode\n", DBG_PRINT(INFO_DBG, "%s: left promiscuous mode\n",
dev->name); dev->name);
} }
...@@ -5325,7 +5370,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) ...@@ -5325,7 +5370,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
break; break;
} }
} }
config->max_txds = MAX_SKB_FRAGS; config->max_txds = MAX_SKB_FRAGS + 1;
/* Rx side parameters. */ /* Rx side parameters. */
if (rx_ring_sz[0] == 0) if (rx_ring_sz[0] == 0)
...@@ -5525,9 +5570,14 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) ...@@ -5525,9 +5570,14 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
if (sp->device_type & XFRAME_II_DEVICE) { if (sp->device_type & XFRAME_II_DEVICE) {
DBG_PRINT(ERR_DBG, "%s: Neterion Xframe II 10GbE adapter ", DBG_PRINT(ERR_DBG, "%s: Neterion Xframe II 10GbE adapter ",
dev->name); dev->name);
DBG_PRINT(ERR_DBG, "(rev %d), Driver %s\n", DBG_PRINT(ERR_DBG, "(rev %d), %s",
get_xena_rev_id(sp->pdev), get_xena_rev_id(sp->pdev),
s2io_driver_version); s2io_driver_version);
#ifdef CONFIG_2BUFF_MODE
DBG_PRINT(ERR_DBG, ", Buffer mode %d",2);
#endif
DBG_PRINT(ERR_DBG, "\nCopyright(c) 2002-2005 Neterion Inc.\n");
DBG_PRINT(ERR_DBG, "MAC ADDR: %02x:%02x:%02x:%02x:%02x:%02x\n", DBG_PRINT(ERR_DBG, "MAC ADDR: %02x:%02x:%02x:%02x:%02x:%02x\n",
sp->def_mac_addr[0].mac_addr[0], sp->def_mac_addr[0].mac_addr[0],
sp->def_mac_addr[0].mac_addr[1], sp->def_mac_addr[0].mac_addr[1],
...@@ -5544,9 +5594,13 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) ...@@ -5544,9 +5594,13 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
} else { } else {
DBG_PRINT(ERR_DBG, "%s: Neterion Xframe I 10GbE adapter ", DBG_PRINT(ERR_DBG, "%s: Neterion Xframe I 10GbE adapter ",
dev->name); dev->name);
DBG_PRINT(ERR_DBG, "(rev %d), Driver %s\n", DBG_PRINT(ERR_DBG, "(rev %d), %s",
get_xena_rev_id(sp->pdev), get_xena_rev_id(sp->pdev),
s2io_driver_version); s2io_driver_version);
#ifdef CONFIG_2BUFF_MODE
DBG_PRINT(ERR_DBG, ", Buffer mode %d",2);
#endif
DBG_PRINT(ERR_DBG, "\nCopyright(c) 2002-2005 Neterion Inc.\n");
DBG_PRINT(ERR_DBG, "MAC ADDR: %02x:%02x:%02x:%02x:%02x:%02x\n", DBG_PRINT(ERR_DBG, "MAC ADDR: %02x:%02x:%02x:%02x:%02x:%02x\n",
sp->def_mac_addr[0].mac_addr[0], sp->def_mac_addr[0].mac_addr[0],
sp->def_mac_addr[0].mac_addr[1], sp->def_mac_addr[0].mac_addr[1],
......
/************************************************************************ /************************************************************************
* s2io.h: A Linux PCI-X Ethernet driver for S2IO 10GbE Server NIC * s2io.h: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC
* Copyright(c) 2002-2005 Neterion Inc. * Copyright(c) 2002-2005 Neterion Inc.
* This software may be used and distributed according to the terms of * This software may be used and distributed according to the terms of
...@@ -622,6 +622,9 @@ typedef struct mac_info { ...@@ -622,6 +622,9 @@ typedef struct mac_info {
/* Fifo specific structure */ /* Fifo specific structure */
fifo_info_t fifos[MAX_TX_FIFOS]; fifo_info_t fifos[MAX_TX_FIFOS];
/* Save virtual address of TxD page with zero DMA addr(if any) */
void *zerodma_virt_addr;
/* rx side stuff */ /* rx side stuff */
/* Ring specific structure */ /* Ring specific structure */
ring_info_t rings[MAX_RX_RINGS]; ring_info_t rings[MAX_RX_RINGS];
......
This diff is collapsed.
This diff is collapsed.
/*
* Network device driver for Cell Processor-Based Blade
*
* (C) Copyright IBM Corp. 2005
*
* Authors : Utz Bacher <utz.bacher@de.ibm.com>
* Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/netdevice.h>
#include <linux/ethtool.h>
#include <linux/pci.h>
#include "spider_net.h"
static int
spider_net_ethtool_get_settings(struct net_device *netdev,
struct ethtool_cmd *cmd)
{
struct spider_net_card *card;
card = netdev_priv(netdev);
cmd->supported = (SUPPORTED_1000baseT_Full |
SUPPORTED_FIBRE);
cmd->advertising = (ADVERTISED_1000baseT_Full |
ADVERTISED_FIBRE);
cmd->port = PORT_FIBRE;
cmd->speed = card->phy.speed;
cmd->duplex = DUPLEX_FULL;
return 0;
}
static void
spider_net_ethtool_get_drvinfo(struct net_device *netdev,
struct ethtool_drvinfo *drvinfo)
{
struct spider_net_card *card;
card = netdev_priv(netdev);
/* clear and fill out info */
memset(drvinfo, 0, sizeof(struct ethtool_drvinfo));
strncpy(drvinfo->driver, spider_net_driver_name, 32);
strncpy(drvinfo->version, "0.1", 32);
strcpy(drvinfo->fw_version, "no information");
strncpy(drvinfo->bus_info, pci_name(card->pdev), 32);
}
static void
spider_net_ethtool_get_wol(struct net_device *netdev,
struct ethtool_wolinfo *wolinfo)
{
/* no support for wol */
wolinfo->supported = 0;
wolinfo->wolopts = 0;
}
static u32
spider_net_ethtool_get_msglevel(struct net_device *netdev)
{
struct spider_net_card *card;
card = netdev_priv(netdev);
return card->msg_enable;
}
static void
spider_net_ethtool_set_msglevel(struct net_device *netdev,
u32 level)
{
struct spider_net_card *card;
card = netdev_priv(netdev);
card->msg_enable = level;
}
static int
spider_net_ethtool_nway_reset(struct net_device *netdev)
{
if (netif_running(netdev)) {
spider_net_stop(netdev);
spider_net_open(netdev);
}
return 0;
}
static u32
spider_net_ethtool_get_rx_csum(struct net_device *netdev)
{
struct spider_net_card *card = netdev->priv;
return card->options.rx_csum;
}
static int
spider_net_ethtool_set_rx_csum(struct net_device *netdev, u32 n)
{
struct spider_net_card *card = netdev->priv;
card->options.rx_csum = n;
return 0;
}
struct ethtool_ops spider_net_ethtool_ops = {
.get_settings = spider_net_ethtool_get_settings,
.get_drvinfo = spider_net_ethtool_get_drvinfo,
.get_wol = spider_net_ethtool_get_wol,
.get_msglevel = spider_net_ethtool_get_msglevel,
.set_msglevel = spider_net_ethtool_set_msglevel,
.nway_reset = spider_net_ethtool_nway_reset,
.get_rx_csum = spider_net_ethtool_get_rx_csum,
.set_rx_csum = spider_net_ethtool_set_rx_csum,
};
...@@ -162,7 +162,7 @@ struct lance_private { ...@@ -162,7 +162,7 @@ struct lance_private {
#define MEM lp->mem #define MEM lp->mem
#define DREG lp->iobase[0] #define DREG lp->iobase[0]
#define AREG lp->iobase[1] #define AREG lp->iobase[1]
#define REGA(a) ( AREG = (a), DREG ) #define REGA(a) (*( AREG = (a), &DREG ))
/* Definitions for the Lance */ /* Definitions for the Lance */
......
...@@ -3258,7 +3258,7 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) ...@@ -3258,7 +3258,7 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs)
wstats.noise = apriv->wstats.qual.noise; wstats.noise = apriv->wstats.qual.noise;
wstats.updated = IW_QUAL_LEVEL_UPDATED wstats.updated = IW_QUAL_LEVEL_UPDATED
| IW_QUAL_QUAL_UPDATED | IW_QUAL_QUAL_UPDATED
| IW_QUAL_NOISE_UPDATED; | IW_QUAL_DBM;
/* Update spy records */ /* Update spy records */
wireless_spy_update(dev, sa, &wstats); wireless_spy_update(dev, sa, &wstats);
} }
...@@ -3604,7 +3604,7 @@ void mpi_receive_802_11 (struct airo_info *ai) ...@@ -3604,7 +3604,7 @@ void mpi_receive_802_11 (struct airo_info *ai)
wstats.noise = ai->wstats.qual.noise; wstats.noise = ai->wstats.qual.noise;
wstats.updated = IW_QUAL_QUAL_UPDATED wstats.updated = IW_QUAL_QUAL_UPDATED
| IW_QUAL_LEVEL_UPDATED | IW_QUAL_LEVEL_UPDATED
| IW_QUAL_NOISE_UPDATED; | IW_QUAL_DBM;
/* Update spy records */ /* Update spy records */
wireless_spy_update(ai->dev, sa, &wstats); wireless_spy_update(ai->dev, sa, &wstats);
} }
...@@ -6489,22 +6489,20 @@ static int airo_get_range(struct net_device *dev, ...@@ -6489,22 +6489,20 @@ static int airo_get_range(struct net_device *dev,
range->max_qual.qual = 100; /* % */ range->max_qual.qual = 100; /* % */
else else
range->max_qual.qual = airo_get_max_quality(&cap_rid); range->max_qual.qual = airo_get_max_quality(&cap_rid);
range->max_qual.level = 0; /* 0 means we use dBm */ range->max_qual.level = 0x100 - 120; /* -120 dBm */
range->max_qual.noise = 0; range->max_qual.noise = 0x100 - 120; /* -120 dBm */
range->max_qual.updated = 0;
/* Experimental measurements - boundary 11/5.5 Mb/s */ /* Experimental measurements - boundary 11/5.5 Mb/s */
/* Note : with or without the (local->rssi), results /* Note : with or without the (local->rssi), results
* are somewhat different. - Jean II */ * are somewhat different. - Jean II */
if (local->rssi) { if (local->rssi) {
range->avg_qual.qual = 50; /* % */ range->avg_qual.qual = 50; /* % */
range->avg_qual.level = 186; /* -70 dBm */ range->avg_qual.level = 0x100 - 70; /* -70 dBm */
} else { } else {
range->avg_qual.qual = airo_get_avg_quality(&cap_rid); range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
range->avg_qual.level = 176; /* -80 dBm */ range->avg_qual.level = 0x100 - 80; /* -80 dBm */
} }
range->avg_qual.noise = 0; range->avg_qual.noise = 0x100 - 85; /* -85 dBm */
range->avg_qual.updated = 0;
for(i = 0 ; i < 8 ; i++) { for(i = 0 ; i < 8 ; i++) {
range->bitrate[i] = cap_rid.supportedRates[i] * 500000; range->bitrate[i] = cap_rid.supportedRates[i] * 500000;
...@@ -6727,15 +6725,17 @@ static int airo_get_aplist(struct net_device *dev, ...@@ -6727,15 +6725,17 @@ static int airo_get_aplist(struct net_device *dev,
if (local->rssi) { if (local->rssi) {
qual[i].level = 0x100 - BSSList.dBm; qual[i].level = 0x100 - BSSList.dBm;
qual[i].qual = airo_dbm_to_pct( local->rssi, BSSList.dBm ); qual[i].qual = airo_dbm_to_pct( local->rssi, BSSList.dBm );
qual[i].updated = IW_QUAL_QUAL_UPDATED; qual[i].updated = IW_QUAL_QUAL_UPDATED
| IW_QUAL_LEVEL_UPDATED
| IW_QUAL_DBM;
} else { } else {
qual[i].level = (BSSList.dBm + 321) / 2; qual[i].level = (BSSList.dBm + 321) / 2;
qual[i].qual = 0; qual[i].qual = 0;
qual[i].updated = IW_QUAL_QUAL_INVALID; qual[i].updated = IW_QUAL_QUAL_INVALID
| IW_QUAL_LEVEL_UPDATED
| IW_QUAL_DBM;
} }
qual[i].noise = local->wstats.qual.noise; qual[i].noise = local->wstats.qual.noise;
qual[i].updated = IW_QUAL_LEVEL_UPDATED
| IW_QUAL_NOISE_UPDATED;
if (BSSList.index == 0xffff) if (BSSList.index == 0xffff)
break; break;
} }
...@@ -6861,15 +6861,17 @@ static inline char *airo_translate_scan(struct net_device *dev, ...@@ -6861,15 +6861,17 @@ static inline char *airo_translate_scan(struct net_device *dev,
if (ai->rssi) { if (ai->rssi) {
iwe.u.qual.level = 0x100 - bss->dBm; iwe.u.qual.level = 0x100 - bss->dBm;
iwe.u.qual.qual = airo_dbm_to_pct( ai->rssi, bss->dBm ); iwe.u.qual.qual = airo_dbm_to_pct( ai->rssi, bss->dBm );
iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED; iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED
| IW_QUAL_LEVEL_UPDATED
| IW_QUAL_DBM;
} else { } else {
iwe.u.qual.level = (bss->dBm + 321) / 2; iwe.u.qual.level = (bss->dBm + 321) / 2;
iwe.u.qual.qual = 0; iwe.u.qual.qual = 0;
iwe.u.qual.updated = IW_QUAL_QUAL_INVALID; iwe.u.qual.updated = IW_QUAL_QUAL_INVALID
| IW_QUAL_LEVEL_UPDATED
| IW_QUAL_DBM;
} }
iwe.u.qual.noise = ai->wstats.qual.noise; iwe.u.qual.noise = ai->wstats.qual.noise;
iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED
| IW_QUAL_NOISE_UPDATED;
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN); current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
/* Add encryption capability */ /* Add encryption capability */
...@@ -7222,13 +7224,12 @@ static void airo_read_wireless_stats(struct airo_info *local) ...@@ -7222,13 +7224,12 @@ static void airo_read_wireless_stats(struct airo_info *local)
local->wstats.qual.level = (status_rid.normalizedSignalStrength + 321) / 2; local->wstats.qual.level = (status_rid.normalizedSignalStrength + 321) / 2;
local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid); local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid);
} }
local->wstats.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED;
if (status_rid.len >= 124) { if (status_rid.len >= 124) {
local->wstats.qual.noise = 0x100 - status_rid.noisedBm; local->wstats.qual.noise = 0x100 - status_rid.noisedBm;
local->wstats.qual.updated |= IW_QUAL_NOISE_UPDATED; local->wstats.qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
} else { } else {
local->wstats.qual.noise = 0; local->wstats.qual.noise = 0;
local->wstats.qual.updated |= IW_QUAL_NOISE_INVALID; local->wstats.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID | IW_QUAL_DBM;
} }
/* Packets discarded in the wireless adapter due to wireless /* Packets discarded in the wireless adapter due to wireless
......
...@@ -1593,7 +1593,6 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT ...@@ -1593,7 +1593,6 @@ struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWT
dev->set_mac_address = atmel_set_mac_address; dev->set_mac_address = atmel_set_mac_address;
dev->hard_start_xmit = start_tx; dev->hard_start_xmit = start_tx;
dev->get_stats = atmel_get_stats; dev->get_stats = atmel_get_stats;
dev->get_wireless_stats = atmel_get_wireless_stats;
dev->wireless_handlers = (struct iw_handler_def *)&atmel_handler_def; dev->wireless_handlers = (struct iw_handler_def *)&atmel_handler_def;
dev->do_ioctl = atmel_ioctl; dev->do_ioctl = atmel_ioctl;
dev->irq = irq; dev->irq = irq;
...@@ -2411,7 +2410,8 @@ static const struct iw_handler_def atmel_handler_def = ...@@ -2411,7 +2410,8 @@ static const struct iw_handler_def atmel_handler_def =
.num_private_args = sizeof(atmel_private_args)/sizeof(struct iw_priv_args), .num_private_args = sizeof(atmel_private_args)/sizeof(struct iw_priv_args),
.standard = (iw_handler *) atmel_handler, .standard = (iw_handler *) atmel_handler,
.private = (iw_handler *) atmel_private_handler, .private = (iw_handler *) atmel_private_handler,
.private_args = (struct iw_priv_args *) atmel_private_args .private_args = (struct iw_priv_args *) atmel_private_args,
.get_wireless_stats = atmel_get_wireless_stats
}; };
static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
...@@ -2424,19 +2424,6 @@ static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -2424,19 +2424,6 @@ static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
char domain[REGDOMAINSZ+1]; char domain[REGDOMAINSZ+1];
switch (cmd) { switch (cmd) {
case SIOCGIWPRIV:
if(wrq->u.data.pointer) {
/* Set the number of ioctl available */
wrq->u.data.length = sizeof(atmel_private_args) / sizeof(atmel_private_args[0]);
/* Copy structure to the user buffer */
if (copy_to_user(wrq->u.data.pointer,
(u_char *) atmel_private_args,
sizeof(atmel_private_args)))
rc = -EFAULT;
}
break;
case ATMELIDIFC: case ATMELIDIFC:
wrq->u.param.value = ATMELMAGIC; wrq->u.param.value = ATMELMAGIC;
break; break;
......
This diff is collapsed.
This diff is collapsed.
...@@ -471,12 +471,12 @@ static dev_link_t *netwave_attach(void) ...@@ -471,12 +471,12 @@ static dev_link_t *netwave_attach(void)
dev->get_stats = &netwave_get_stats; dev->get_stats = &netwave_get_stats;
dev->set_multicast_list = &set_multicast_list; dev->set_multicast_list = &set_multicast_list;
/* wireless extensions */ /* wireless extensions */
#ifdef WIRELESS_EXT #if WIRELESS_EXT <= 16
dev->get_wireless_stats = &netwave_get_wireless_stats; dev->get_wireless_stats = &netwave_get_wireless_stats;
#endif /* WIRELESS_EXT <= 16 */
#if WIRELESS_EXT > 12 #if WIRELESS_EXT > 12
dev->wireless_handlers = (struct iw_handler_def *)&netwave_handler_def; dev->wireless_handlers = (struct iw_handler_def *)&netwave_handler_def;
#endif /* WIRELESS_EXT > 12 */ #endif /* WIRELESS_EXT > 12 */
#endif /* WIRELESS_EXT */
dev->do_ioctl = &netwave_ioctl; dev->do_ioctl = &netwave_ioctl;
dev->tx_timeout = &netwave_watchdog; dev->tx_timeout = &netwave_watchdog;
...@@ -839,6 +839,9 @@ static const struct iw_handler_def netwave_handler_def = ...@@ -839,6 +839,9 @@ static const struct iw_handler_def netwave_handler_def =
.standard = (iw_handler *) netwave_handler, .standard = (iw_handler *) netwave_handler,
.private = (iw_handler *) netwave_private_handler, .private = (iw_handler *) netwave_private_handler,
.private_args = (struct iw_priv_args *) netwave_private_args, .private_args = (struct iw_priv_args *) netwave_private_args,
#if WIRELESS_EXT > 16
.get_wireless_stats = netwave_get_wireless_stats,
#endif /* WIRELESS_EXT > 16 */
}; };
#endif /* WIRELESS_EXT > 12 */ #endif /* WIRELESS_EXT > 12 */
......
...@@ -2727,6 +2727,9 @@ const struct iw_handler_def prism54_handler_def = { ...@@ -2727,6 +2727,9 @@ const struct iw_handler_def prism54_handler_def = {
.standard = (iw_handler *) prism54_handler, .standard = (iw_handler *) prism54_handler,
.private = (iw_handler *) prism54_private_handler, .private = (iw_handler *) prism54_private_handler,
.private_args = (struct iw_priv_args *) prism54_private_args, .private_args = (struct iw_priv_args *) prism54_private_args,
#if WIRELESS_EXT > 16
.get_wireless_stats = prism54_get_wireless_stats,
#endif /* WIRELESS_EXT > 16 */
#if WIRELESS_EXT == 16 #if WIRELESS_EXT == 16
.spy_offset = offsetof(islpci_private, spy_data), .spy_offset = offsetof(islpci_private, spy_data),
#endif /* WIRELESS_EXT == 16 */ #endif /* WIRELESS_EXT == 16 */
......
...@@ -815,7 +815,6 @@ islpci_setup(struct pci_dev *pdev) ...@@ -815,7 +815,6 @@ islpci_setup(struct pci_dev *pdev)
ndev->open = &islpci_open; ndev->open = &islpci_open;
ndev->stop = &islpci_close; ndev->stop = &islpci_close;
ndev->get_stats = &islpci_statistics; ndev->get_stats = &islpci_statistics;
ndev->get_wireless_stats = &prism54_get_wireless_stats;
ndev->do_ioctl = &prism54_ioctl; ndev->do_ioctl = &prism54_ioctl;
ndev->wireless_handlers = ndev->wireless_handlers =
(struct iw_handler_def *) &prism54_handler_def; (struct iw_handler_def *) &prism54_handler_def;
...@@ -844,6 +843,8 @@ islpci_setup(struct pci_dev *pdev) ...@@ -844,6 +843,8 @@ islpci_setup(struct pci_dev *pdev)
/* Add pointers to enable iwspy support. */ /* Add pointers to enable iwspy support. */
priv->wireless_data.spy_data = &priv->spy_data; priv->wireless_data.spy_data = &priv->spy_data;
ndev->wireless_data = &priv->wireless_data; ndev->wireless_data = &priv->wireless_data;
#else /* WIRELESS_EXT > 16 */
ndev->get_wireless_stats = &prism54_get_wireless_stats;
#endif /* WIRELESS_EXT > 16 */ #endif /* WIRELESS_EXT > 16 */
/* save the start and end address of the PCI memory area */ /* save the start and end address of the PCI memory area */
......
This diff is collapsed.
...@@ -63,13 +63,10 @@ typedef struct ray_dev_t { ...@@ -63,13 +63,10 @@ typedef struct ray_dev_t {
UCHAR last_rsl; UCHAR last_rsl;
int beacon_rxed; int beacon_rxed;
struct beacon_rx last_bcn; struct beacon_rx last_bcn;
#ifdef WIRELESS_EXT
iw_stats wstats; /* Wireless specific stats */ iw_stats wstats; /* Wireless specific stats */
#endif
#ifdef WIRELESS_SPY #ifdef WIRELESS_SPY
int spy_number; /* Number of addresses to spy */ struct iw_spy_data spy_data;
mac_addr spy_address[IW_MAX_SPY + 1]; /* The addresses to spy */ struct iw_public_data wireless_data;
iw_qual spy_stat[IW_MAX_SPY + 1]; /* Statistics gathered */
#endif /* WIRELESS_SPY */ #endif /* WIRELESS_SPY */
} ray_dev_t; } ray_dev_t;
......
...@@ -609,6 +609,7 @@ struct wl3501_card { ...@@ -609,6 +609,7 @@ struct wl3501_card {
struct net_device_stats stats; struct net_device_stats stats;
struct iw_statistics wstats; struct iw_statistics wstats;
struct iw_spy_data spy_data; struct iw_spy_data spy_data;
struct iw_public_data wireless_data;
struct dev_node_t node; struct dev_node_t node;
}; };
#endif #endif
...@@ -1944,7 +1944,7 @@ static const iw_handler wl3501_handler[] = { ...@@ -1944,7 +1944,7 @@ static const iw_handler wl3501_handler[] = {
static const struct iw_handler_def wl3501_handler_def = { static const struct iw_handler_def wl3501_handler_def = {
.num_standard = sizeof(wl3501_handler) / sizeof(iw_handler), .num_standard = sizeof(wl3501_handler) / sizeof(iw_handler),
.standard = (iw_handler *)wl3501_handler, .standard = (iw_handler *)wl3501_handler,
.spy_offset = offsetof(struct wl3501_card, spy_data), .get_wireless_stats = wl3501_get_wireless_stats,
}; };
/** /**
...@@ -1961,6 +1961,7 @@ static dev_link_t *wl3501_attach(void) ...@@ -1961,6 +1961,7 @@ static dev_link_t *wl3501_attach(void)
client_reg_t client_reg; client_reg_t client_reg;
dev_link_t *link; dev_link_t *link;
struct net_device *dev; struct net_device *dev;
struct wl3501_card *this;
int ret; int ret;
/* Initialize the dev_link_t structure */ /* Initialize the dev_link_t structure */
...@@ -1995,7 +1996,9 @@ static dev_link_t *wl3501_attach(void) ...@@ -1995,7 +1996,9 @@ static dev_link_t *wl3501_attach(void)
dev->tx_timeout = wl3501_tx_timeout; dev->tx_timeout = wl3501_tx_timeout;
dev->watchdog_timeo = 5 * HZ; dev->watchdog_timeo = 5 * HZ;
dev->get_stats = wl3501_get_stats; dev->get_stats = wl3501_get_stats;
dev->get_wireless_stats = wl3501_get_wireless_stats; this = dev->priv;
this->wireless_data.spy_data = &this->spy_data;
dev->wireless_data = &this->wireless_data;
dev->wireless_handlers = (struct iw_handler_def *)&wl3501_handler_def; dev->wireless_handlers = (struct iw_handler_def *)&wl3501_handler_def;
SET_ETHTOOL_OPS(dev, &ops); SET_ETHTOOL_OPS(dev, &ops);
netif_stop_queue(dev); netif_stop_queue(dev);
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
* drivers/s390/net/claw.c * drivers/s390/net/claw.c
* ESCON CLAW network driver * ESCON CLAW network driver
* *
* $Revision: 1.35 $ $Date: 2005/03/24 12:25:38 $ * $Revision: 1.38 $ $Date: 2005/08/29 09:47:04 $
* *
* Linux fo zSeries version * Linux for zSeries version
* Copyright (C) 2002,2005 IBM Corporation * Copyright (C) 2002,2005 IBM Corporation
* Author(s) Original code written by: * Author(s) Original code written by:
* Kazuo Iimura (iimura@jp.ibm.com) * Kazuo Iimura (iimura@jp.ibm.com)
...@@ -431,12 +431,12 @@ claw_pack_skb(struct claw_privbk *privptr) ...@@ -431,12 +431,12 @@ claw_pack_skb(struct claw_privbk *privptr)
if (!skb_queue_empty(&p_ch->collect_queue)) { if (!skb_queue_empty(&p_ch->collect_queue)) {
/* some data */ /* some data */
held_skb = skb_dequeue(&p_ch->collect_queue); held_skb = skb_dequeue(&p_ch->collect_queue);
if (p_env->packing != DO_PACKED)
return held_skb;
if (held_skb) if (held_skb)
atomic_dec(&held_skb->users); dev_kfree_skb_any(held_skb);
else else
return NULL; return NULL;
if (p_env->packing != DO_PACKED)
return held_skb;
/* get a new SKB we will pack at least one */ /* get a new SKB we will pack at least one */
new_skb = dev_alloc_skb(p_env->write_size); new_skb = dev_alloc_skb(p_env->write_size);
if (new_skb == NULL) { if (new_skb == NULL) {
...@@ -455,7 +455,7 @@ claw_pack_skb(struct claw_privbk *privptr) ...@@ -455,7 +455,7 @@ claw_pack_skb(struct claw_privbk *privptr)
privptr->stats.tx_packets++; privptr->stats.tx_packets++;
so_far += held_skb->len; so_far += held_skb->len;
pkt_cnt++; pkt_cnt++;
dev_kfree_skb_irq(held_skb); dev_kfree_skb_any(held_skb);
held_skb = skb_dequeue(&p_ch->collect_queue); held_skb = skb_dequeue(&p_ch->collect_queue);
if (held_skb) if (held_skb)
atomic_dec(&held_skb->users); atomic_dec(&held_skb->users);
...@@ -1092,7 +1092,7 @@ claw_release(struct net_device *dev) ...@@ -1092,7 +1092,7 @@ claw_release(struct net_device *dev)
} }
} }
if (privptr->pk_skb != NULL) { if (privptr->pk_skb != NULL) {
dev_kfree_skb(privptr->pk_skb); dev_kfree_skb_any(privptr->pk_skb);
privptr->pk_skb = NULL; privptr->pk_skb = NULL;
} }
if(privptr->buffs_alloc != 1) { if(privptr->buffs_alloc != 1) {
...@@ -2016,7 +2016,7 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid) ...@@ -2016,7 +2016,7 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid)
p_buf=(struct ccwbk*)privptr->p_end_ccw; p_buf=(struct ccwbk*)privptr->p_end_ccw;
dumpit((char *)p_buf, sizeof(struct endccw)); dumpit((char *)p_buf, sizeof(struct endccw));
#endif #endif
dev_kfree_skb(skb); dev_kfree_skb_any(skb);
if (linkid==0) { if (linkid==0) {
lock=LOCK_NO; lock=LOCK_NO;
} }
...@@ -4061,7 +4061,7 @@ claw_purge_skb_queue(struct sk_buff_head *q) ...@@ -4061,7 +4061,7 @@ claw_purge_skb_queue(struct sk_buff_head *q)
while ((skb = skb_dequeue(q))) { while ((skb = skb_dequeue(q))) {
atomic_dec(&skb->users); atomic_dec(&skb->users);
dev_kfree_skb_irq(skb); dev_kfree_skb_any(skb);
} }
} }
...@@ -4410,7 +4410,7 @@ claw_init(void) ...@@ -4410,7 +4410,7 @@ claw_init(void)
#else #else
"compiled into kernel " "compiled into kernel "
#endif #endif
" $Revision: 1.35 $ $Date: 2005/03/24 12:25:38 $ \n"); " $Revision: 1.38 $ $Date: 2005/08/29 09:47:04 $ \n");
#ifdef FUNCTRACE #ifdef FUNCTRACE
......
...@@ -1612,6 +1612,7 @@ ...@@ -1612,6 +1612,7 @@
#define PCI_DEVICE_ID_TOSHIBA_TC35815CF 0x0030 #define PCI_DEVICE_ID_TOSHIBA_TC35815CF 0x0030
#define PCI_DEVICE_ID_TOSHIBA_TX4927 0x0180 #define PCI_DEVICE_ID_TOSHIBA_TX4927 0x0180
#define PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC 0x0108 #define PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC 0x0108
#define PCI_DEVICE_ID_TOSHIBA_SPIDER_NET 0x01b3
#define PCI_VENDOR_ID_RICOH 0x1180 #define PCI_VENDOR_ID_RICOH 0x1180
#define PCI_DEVICE_ID_RICOH_RL5C465 0x0465 #define PCI_DEVICE_ID_RICOH_RL5C465 0x0465
......
/* /*
* This file define a set of standard wireless extensions * This file define a set of standard wireless extensions
* *
* Version : 18 12.3.05 * Version : 19 18.3.05
* *
* Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com> * Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
* Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved. * Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved.
...@@ -69,8 +69,6 @@ ...@@ -69,8 +69,6 @@
/***************************** INCLUDES *****************************/ /***************************** INCLUDES *****************************/
/* To minimise problems in user space, I might remove those headers
* at some point. Jean II */
#include <linux/types.h> /* for "caddr_t" et al */ #include <linux/types.h> /* for "caddr_t" et al */
#include <linux/socket.h> /* for "struct sockaddr" et al */ #include <linux/socket.h> /* for "struct sockaddr" et al */
#include <linux/if.h> /* for IFNAMSIZ and co... */ #include <linux/if.h> /* for IFNAMSIZ and co... */
...@@ -82,7 +80,7 @@ ...@@ -82,7 +80,7 @@
* (there is some stuff that will be added in the future...) * (there is some stuff that will be added in the future...)
* I just plan to increment with each new version. * I just plan to increment with each new version.
*/ */
#define WIRELESS_EXT 18 #define WIRELESS_EXT 19
/* /*
* Changes : * Changes :
...@@ -197,6 +195,15 @@ ...@@ -197,6 +195,15 @@
* related parameters (extensible up to 4096 parameter values) * related parameters (extensible up to 4096 parameter values)
* - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE, * - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE,
* IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND * IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND
*
* V18 to V19
* ----------
* - Remove (struct iw_point *)->pointer from events and streams
* - Remove header includes to help user space
* - Increase IW_ENCODING_TOKEN_MAX from 32 to 64
* - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros
* - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM
* - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros
*/ */
/**************************** CONSTANTS ****************************/ /**************************** CONSTANTS ****************************/
...@@ -322,6 +329,7 @@ ...@@ -322,6 +329,7 @@
/* The first and the last (range) */ /* The first and the last (range) */
#define SIOCIWFIRST 0x8B00 #define SIOCIWFIRST 0x8B00
#define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */ #define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */
#define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST)
/* Even : get (world access), odd : set (root access) */ /* Even : get (world access), odd : set (root access) */
#define IW_IS_SET(cmd) (!((cmd) & 0x1)) #define IW_IS_SET(cmd) (!((cmd) & 0x1))
...@@ -366,6 +374,7 @@ ...@@ -366,6 +374,7 @@
* (struct iw_pmkid_cand) */ * (struct iw_pmkid_cand) */
#define IWEVFIRST 0x8C00 #define IWEVFIRST 0x8C00
#define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST)
/* ------------------------- PRIVATE INFO ------------------------- */ /* ------------------------- PRIVATE INFO ------------------------- */
/* /*
...@@ -427,12 +436,15 @@ ...@@ -427,12 +436,15 @@
#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */ #define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */
/* Statistics flags (bitmask in updated) */ /* Statistics flags (bitmask in updated) */
#define IW_QUAL_QUAL_UPDATED 0x1 /* Value was updated since last read */ #define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */
#define IW_QUAL_LEVEL_UPDATED 0x2 #define IW_QUAL_LEVEL_UPDATED 0x02
#define IW_QUAL_NOISE_UPDATED 0x4 #define IW_QUAL_NOISE_UPDATED 0x04
#define IW_QUAL_ALL_UPDATED 0x07
#define IW_QUAL_DBM 0x08 /* Level + Noise are dBm */
#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */ #define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */
#define IW_QUAL_LEVEL_INVALID 0x20 #define IW_QUAL_LEVEL_INVALID 0x20
#define IW_QUAL_NOISE_INVALID 0x40 #define IW_QUAL_NOISE_INVALID 0x40
#define IW_QUAL_ALL_INVALID 0x70
/* Frequency flags */ /* Frequency flags */
#define IW_FREQ_AUTO 0x00 /* Let the driver decides */ #define IW_FREQ_AUTO 0x00 /* Let the driver decides */
...@@ -443,7 +455,7 @@ ...@@ -443,7 +455,7 @@
#define IW_MAX_ENCODING_SIZES 8 #define IW_MAX_ENCODING_SIZES 8
/* Maximum size of the encoding token in bytes */ /* Maximum size of the encoding token in bytes */
#define IW_ENCODING_TOKEN_MAX 32 /* 256 bits (for now) */ #define IW_ENCODING_TOKEN_MAX 64 /* 512 bits (for now) */
/* Flags for encoding (along with the token) */ /* Flags for encoding (along with the token) */
#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */ #define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */
...@@ -1039,12 +1051,16 @@ struct iw_event ...@@ -1039,12 +1051,16 @@ struct iw_event
#define IW_EV_CHAR_LEN (IW_EV_LCP_LEN + IFNAMSIZ) #define IW_EV_CHAR_LEN (IW_EV_LCP_LEN + IFNAMSIZ)
#define IW_EV_UINT_LEN (IW_EV_LCP_LEN + sizeof(__u32)) #define IW_EV_UINT_LEN (IW_EV_LCP_LEN + sizeof(__u32))
#define IW_EV_FREQ_LEN (IW_EV_LCP_LEN + sizeof(struct iw_freq)) #define IW_EV_FREQ_LEN (IW_EV_LCP_LEN + sizeof(struct iw_freq))
#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point))
#define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param)) #define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param))
#define IW_EV_ADDR_LEN (IW_EV_LCP_LEN + sizeof(struct sockaddr)) #define IW_EV_ADDR_LEN (IW_EV_LCP_LEN + sizeof(struct sockaddr))
#define IW_EV_QUAL_LEN (IW_EV_LCP_LEN + sizeof(struct iw_quality)) #define IW_EV_QUAL_LEN (IW_EV_LCP_LEN + sizeof(struct iw_quality))
/* Note : in the case of iw_point, the extra data will come at the /* iw_point events are special. First, the payload (extra data) come at
* end of the event */ * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second,
* we omit the pointer, so start at an offset. */
#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \
(char *) NULL)
#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \
IW_EV_POINT_OFF)
#endif /* _LINUX_WIRELESS_H */ #endif /* _LINUX_WIRELESS_H */
/* /*
* This file define the new driver API for Wireless Extensions * This file define the new driver API for Wireless Extensions
* *
* Version : 6 21.6.04 * Version : 7 18.3.05
* *
* Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com> * Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
* Copyright (c) 2001-2004 Jean Tourrilhes, All Rights Reserved. * Copyright (c) 2001-2005 Jean Tourrilhes, All Rights Reserved.
*/ */
#ifndef _IW_HANDLER_H #ifndef _IW_HANDLER_H
...@@ -207,7 +207,7 @@ ...@@ -207,7 +207,7 @@
* will be needed... * will be needed...
* I just plan to increment with each new version. * I just plan to increment with each new version.
*/ */
#define IW_HANDLER_VERSION 6 #define IW_HANDLER_VERSION 7
/* /*
* Changes : * Changes :
...@@ -232,6 +232,13 @@ ...@@ -232,6 +232,13 @@
* - Remove spy #ifdef, they are always on -> cleaner code * - Remove spy #ifdef, they are always on -> cleaner code
* - Add IW_DESCR_FLAG_NOMAX flag for very large requests * - Add IW_DESCR_FLAG_NOMAX flag for very large requests
* - Start migrating get_wireless_stats to struct iw_handler_def * - Start migrating get_wireless_stats to struct iw_handler_def
*
* V6 to V7
* --------
* - Add struct ieee80211_device pointer in struct iw_public_data
* - Remove (struct iw_point *)->pointer from events and streams
* - Remove spy_offset from struct iw_handler_def
* - Add "check" version of event macros for ieee802.11 stack
*/ */
/**************************** CONSTANTS ****************************/ /**************************** CONSTANTS ****************************/
...@@ -334,9 +341,6 @@ struct iw_handler_def ...@@ -334,9 +341,6 @@ struct iw_handler_def
* We will automatically export that to user space... */ * We will automatically export that to user space... */
const struct iw_priv_args * private_args; const struct iw_priv_args * private_args;
/* This field will be *removed* in the next version of WE */
long spy_offset; /* DO NOT USE */
/* New location of get_wireless_stats, to de-bloat struct net_device. /* New location of get_wireless_stats, to de-bloat struct net_device.
* The old pointer in struct net_device will be gradually phased * The old pointer in struct net_device will be gradually phased
* out, and drivers are encouraged to use this one... */ * out, and drivers are encouraged to use this one... */
...@@ -400,16 +404,21 @@ struct iw_spy_data ...@@ -400,16 +404,21 @@ struct iw_spy_data
/* --------------------- DEVICE WIRELESS DATA --------------------- */ /* --------------------- DEVICE WIRELESS DATA --------------------- */
/* /*
* This is all the wireless data specific to a device instance that * This is all the wireless data specific to a device instance that
* is managed by the core of Wireless Extensions. * is managed by the core of Wireless Extensions or the 802.11 layer.
* We only keep pointer to those structures, so that a driver is free * We only keep pointer to those structures, so that a driver is free
* to share them between instances. * to share them between instances.
* This structure should be initialised before registering the device. * This structure should be initialised before registering the device.
* Access to this data follow the same rules as any other struct net_device * Access to this data follow the same rules as any other struct net_device
* data (i.e. valid as long as struct net_device exist, same locking rules). * data (i.e. valid as long as struct net_device exist, same locking rules).
*/ */
/* Forward declaration */
struct ieee80211_device;
/* The struct */
struct iw_public_data { struct iw_public_data {
/* Driver enhanced spy support */ /* Driver enhanced spy support */
struct iw_spy_data * spy_data; struct iw_spy_data * spy_data;
/* Structure managed by the in-kernel IEEE 802.11 layer */
struct ieee80211_device * ieee80211;
}; };
/**************************** PROTOTYPES ****************************/ /**************************** PROTOTYPES ****************************/
...@@ -424,7 +433,7 @@ struct iw_public_data { ...@@ -424,7 +433,7 @@ struct iw_public_data {
extern int dev_get_wireless_info(char * buffer, char **start, off_t offset, extern int dev_get_wireless_info(char * buffer, char **start, off_t offset,
int length); int length);
/* Handle IOCTLs, called in net/code/dev.c */ /* Handle IOCTLs, called in net/core/dev.c */
extern int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd); extern int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd);
/* Second : functions that may be called by driver modules */ /* Second : functions that may be called by driver modules */
...@@ -479,7 +488,7 @@ iwe_stream_add_event(char * stream, /* Stream of events */ ...@@ -479,7 +488,7 @@ iwe_stream_add_event(char * stream, /* Stream of events */
int event_len) /* Real size of payload */ int event_len) /* Real size of payload */
{ {
/* Check if it's possible */ /* Check if it's possible */
if((stream + event_len) < ends) { if(likely((stream + event_len) < ends)) {
iwe->len = event_len; iwe->len = event_len;
memcpy(stream, (char *) iwe, event_len); memcpy(stream, (char *) iwe, event_len);
stream += event_len; stream += event_len;
...@@ -495,14 +504,17 @@ iwe_stream_add_event(char * stream, /* Stream of events */ ...@@ -495,14 +504,17 @@ iwe_stream_add_event(char * stream, /* Stream of events */
static inline char * static inline char *
iwe_stream_add_point(char * stream, /* Stream of events */ iwe_stream_add_point(char * stream, /* Stream of events */
char * ends, /* End of stream */ char * ends, /* End of stream */
struct iw_event *iwe, /* Payload */ struct iw_event *iwe, /* Payload length + flags */
char * extra) char * extra) /* More payload */
{ {
int event_len = IW_EV_POINT_LEN + iwe->u.data.length; int event_len = IW_EV_POINT_LEN + iwe->u.data.length;
/* Check if it's possible */ /* Check if it's possible */
if((stream + event_len) < ends) { if(likely((stream + event_len) < ends)) {
iwe->len = event_len; iwe->len = event_len;
memcpy(stream, (char *) iwe, IW_EV_POINT_LEN); memcpy(stream, (char *) iwe, IW_EV_LCP_LEN);
memcpy(stream + IW_EV_LCP_LEN,
((char *) iwe) + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
IW_EV_POINT_LEN - IW_EV_LCP_LEN);
memcpy(stream + IW_EV_POINT_LEN, extra, iwe->u.data.length); memcpy(stream + IW_EV_POINT_LEN, extra, iwe->u.data.length);
stream += event_len; stream += event_len;
} }
...@@ -526,7 +538,7 @@ iwe_stream_add_value(char * event, /* Event in the stream */ ...@@ -526,7 +538,7 @@ iwe_stream_add_value(char * event, /* Event in the stream */
event_len -= IW_EV_LCP_LEN; event_len -= IW_EV_LCP_LEN;
/* Check if it's possible */ /* Check if it's possible */
if((value + event_len) < ends) { if(likely((value + event_len) < ends)) {
/* Add new value */ /* Add new value */
memcpy(value, (char *) iwe + IW_EV_LCP_LEN, event_len); memcpy(value, (char *) iwe + IW_EV_LCP_LEN, event_len);
value += event_len; value += event_len;
...@@ -537,4 +549,85 @@ iwe_stream_add_value(char * event, /* Event in the stream */ ...@@ -537,4 +549,85 @@ iwe_stream_add_value(char * event, /* Event in the stream */
return value; return value;
} }
/*------------------------------------------------------------------*/
/*
* Wrapper to add an Wireless Event to a stream of events.
* Same as above, with explicit error check...
*/
static inline char *
iwe_stream_check_add_event(char * stream, /* Stream of events */
char * ends, /* End of stream */
struct iw_event *iwe, /* Payload */
int event_len, /* Size of payload */
int * perr) /* Error report */
{
/* Check if it's possible, set error if not */
if(likely((stream + event_len) < ends)) {
iwe->len = event_len;
memcpy(stream, (char *) iwe, event_len);
stream += event_len;
} else
*perr = -E2BIG;
return stream;
}
/*------------------------------------------------------------------*/
/*
* Wrapper to add an short Wireless Event containing a pointer to a
* stream of events.
* Same as above, with explicit error check...
*/
static inline char *
iwe_stream_check_add_point(char * stream, /* Stream of events */
char * ends, /* End of stream */
struct iw_event *iwe, /* Payload length + flags */
char * extra, /* More payload */
int * perr) /* Error report */
{
int event_len = IW_EV_POINT_LEN + iwe->u.data.length;
/* Check if it's possible */
if(likely((stream + event_len) < ends)) {
iwe->len = event_len;
memcpy(stream, (char *) iwe, IW_EV_LCP_LEN);
memcpy(stream + IW_EV_LCP_LEN,
((char *) iwe) + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
IW_EV_POINT_LEN - IW_EV_LCP_LEN);
memcpy(stream + IW_EV_POINT_LEN, extra, iwe->u.data.length);
stream += event_len;
} else
*perr = -E2BIG;
return stream;
}
/*------------------------------------------------------------------*/
/*
* Wrapper to add a value to a Wireless Event in a stream of events.
* Be careful, this one is tricky to use properly :
* At the first run, you need to have (value = event + IW_EV_LCP_LEN).
* Same as above, with explicit error check...
*/
static inline char *
iwe_stream_check_add_value(char * event, /* Event in the stream */
char * value, /* Value in event */
char * ends, /* End of stream */
struct iw_event *iwe, /* Payload */
int event_len, /* Size of payload */
int * perr) /* Error report */
{
/* Don't duplicate LCP */
event_len -= IW_EV_LCP_LEN;
/* Check if it's possible */
if(likely((value + event_len) < ends)) {
/* Add new value */
memcpy(value, (char *) iwe + IW_EV_LCP_LEN, event_len);
value += event_len;
/* Patch LCP */
iwe->len = value - event;
memcpy(event, (char *) iwe, IW_EV_LCP_LEN);
} else
*perr = -E2BIG;
return value;
}
#endif /* _IW_HANDLER_H */ #endif /* _IW_HANDLER_H */
...@@ -58,6 +58,13 @@ ...@@ -58,6 +58,13 @@
* o Add wmb() in iw_handler_set_spy() for non-coherent archs/cpus * o Add wmb() in iw_handler_set_spy() for non-coherent archs/cpus
* Based on patch from Pavel Roskin <proski@gnu.org> : * Based on patch from Pavel Roskin <proski@gnu.org> :
* o Fix kernel data leak to user space in private handler handling * o Fix kernel data leak to user space in private handler handling
*
* v7 - 18.3.05 - Jean II
* o Remove (struct iw_point *)->pointer from events and streams
* o Remove spy_offset from struct iw_handler_def
* o Start deprecating dev->get_wireless_stats, output a warning
* o If IW_QUAL_DBM is set, show dBm values in /proc/net/wireless
* o Don't loose INVALID/DBM flags when clearing UPDATED flags (iwstats)
*/ */
/***************************** INCLUDES *****************************/ /***************************** INCLUDES *****************************/
...@@ -446,10 +453,14 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev) ...@@ -446,10 +453,14 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
(dev->wireless_handlers->get_wireless_stats != NULL)) (dev->wireless_handlers->get_wireless_stats != NULL))
return dev->wireless_handlers->get_wireless_stats(dev); return dev->wireless_handlers->get_wireless_stats(dev);
/* Old location, will be phased out in next WE */ /* Old location, field to be removed in next WE */
return (dev->get_wireless_stats ? if(dev->get_wireless_stats) {
dev->get_wireless_stats(dev) : printk(KERN_DEBUG "%s (WE) : Driver using old /proc/net/wireless support, please fix driver !\n",
(struct iw_statistics *) NULL); dev->name);
return dev->get_wireless_stats(dev);
}
/* Not found */
return (struct iw_statistics *) NULL;
} }
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
...@@ -541,16 +552,18 @@ static __inline__ void wireless_seq_printf_stats(struct seq_file *seq, ...@@ -541,16 +552,18 @@ static __inline__ void wireless_seq_printf_stats(struct seq_file *seq,
dev->name, stats->status, stats->qual.qual, dev->name, stats->status, stats->qual.qual,
stats->qual.updated & IW_QUAL_QUAL_UPDATED stats->qual.updated & IW_QUAL_QUAL_UPDATED
? '.' : ' ', ? '.' : ' ',
((__u8) stats->qual.level), ((__s32) stats->qual.level) -
((stats->qual.updated & IW_QUAL_DBM) ? 0x100 : 0),
stats->qual.updated & IW_QUAL_LEVEL_UPDATED stats->qual.updated & IW_QUAL_LEVEL_UPDATED
? '.' : ' ', ? '.' : ' ',
((__u8) stats->qual.noise), ((__s32) stats->qual.noise) -
((stats->qual.updated & IW_QUAL_DBM) ? 0x100 : 0),
stats->qual.updated & IW_QUAL_NOISE_UPDATED stats->qual.updated & IW_QUAL_NOISE_UPDATED
? '.' : ' ', ? '.' : ' ',
stats->discard.nwid, stats->discard.code, stats->discard.nwid, stats->discard.code,
stats->discard.fragment, stats->discard.retries, stats->discard.fragment, stats->discard.retries,
stats->discard.misc, stats->miss.beacon); stats->discard.misc, stats->miss.beacon);
stats->qual.updated = 0; stats->qual.updated &= ~IW_QUAL_ALL_UPDATED;
} }
} }
...@@ -593,6 +606,7 @@ static struct file_operations wireless_seq_fops = { ...@@ -593,6 +606,7 @@ static struct file_operations wireless_seq_fops = {
int __init wireless_proc_init(void) int __init wireless_proc_init(void)
{ {
/* Create /proc/net/wireless entry */
if (!proc_net_fops_create("wireless", S_IRUGO, &wireless_seq_fops)) if (!proc_net_fops_create("wireless", S_IRUGO, &wireless_seq_fops))
return -ENOMEM; return -ENOMEM;
...@@ -627,9 +641,9 @@ static inline int dev_iwstats(struct net_device *dev, struct ifreq *ifr) ...@@ -627,9 +641,9 @@ static inline int dev_iwstats(struct net_device *dev, struct ifreq *ifr)
sizeof(struct iw_statistics))) sizeof(struct iw_statistics)))
return -EFAULT; return -EFAULT;
/* Check if we need to clear the update flag */ /* Check if we need to clear the updated flag */
if(wrq->u.data.flags != 0) if(wrq->u.data.flags != 0)
stats->qual.updated = 0; stats->qual.updated &= ~IW_QUAL_ALL_UPDATED;
return 0; return 0;
} else } else
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -1161,10 +1175,11 @@ void wireless_send_event(struct net_device * dev, ...@@ -1161,10 +1175,11 @@ void wireless_send_event(struct net_device * dev,
struct iw_event *event; /* Mallocated whole event */ struct iw_event *event; /* Mallocated whole event */
int event_len; /* Its size */ int event_len; /* Its size */
int hdr_len; /* Size of the event header */ int hdr_len; /* Size of the event header */
int wrqu_off = 0; /* Offset in wrqu */
/* Don't "optimise" the following variable, it will crash */ /* Don't "optimise" the following variable, it will crash */
unsigned cmd_index; /* *MUST* be unsigned */ unsigned cmd_index; /* *MUST* be unsigned */
/* Get the description of the IOCTL */ /* Get the description of the Event */
if(cmd <= SIOCIWLAST) { if(cmd <= SIOCIWLAST) {
cmd_index = cmd - SIOCIWFIRST; cmd_index = cmd - SIOCIWFIRST;
if(cmd_index < standard_ioctl_num) if(cmd_index < standard_ioctl_num)
...@@ -1207,6 +1222,8 @@ void wireless_send_event(struct net_device * dev, ...@@ -1207,6 +1222,8 @@ void wireless_send_event(struct net_device * dev,
/* Calculate extra_len - extra is NULL for restricted events */ /* Calculate extra_len - extra is NULL for restricted events */
if(extra != NULL) if(extra != NULL)
extra_len = wrqu->data.length * descr->token_size; extra_len = wrqu->data.length * descr->token_size;
/* Always at an offset in wrqu */
wrqu_off = IW_EV_POINT_OFF;
#ifdef WE_EVENT_DEBUG #ifdef WE_EVENT_DEBUG
printk(KERN_DEBUG "%s (WE) : Event 0x%04X, tokens %d, extra_len %d\n", dev->name, cmd, wrqu->data.length, extra_len); printk(KERN_DEBUG "%s (WE) : Event 0x%04X, tokens %d, extra_len %d\n", dev->name, cmd, wrqu->data.length, extra_len);
#endif /* WE_EVENT_DEBUG */ #endif /* WE_EVENT_DEBUG */
...@@ -1217,7 +1234,7 @@ void wireless_send_event(struct net_device * dev, ...@@ -1217,7 +1234,7 @@ void wireless_send_event(struct net_device * dev,
event_len = hdr_len + extra_len; event_len = hdr_len + extra_len;
#ifdef WE_EVENT_DEBUG #ifdef WE_EVENT_DEBUG
printk(KERN_DEBUG "%s (WE) : Event 0x%04X, hdr_len %d, event_len %d\n", dev->name, cmd, hdr_len, event_len); printk(KERN_DEBUG "%s (WE) : Event 0x%04X, hdr_len %d, wrqu_off %d, event_len %d\n", dev->name, cmd, hdr_len, wrqu_off, event_len);
#endif /* WE_EVENT_DEBUG */ #endif /* WE_EVENT_DEBUG */
/* Create temporary buffer to hold the event */ /* Create temporary buffer to hold the event */
...@@ -1228,7 +1245,7 @@ void wireless_send_event(struct net_device * dev, ...@@ -1228,7 +1245,7 @@ void wireless_send_event(struct net_device * dev,
/* Fill event */ /* Fill event */
event->len = event_len; event->len = event_len;
event->cmd = cmd; event->cmd = cmd;
memcpy(&event->u, wrqu, hdr_len - IW_EV_LCP_LEN); memcpy(&event->u, ((char *) wrqu) + wrqu_off, hdr_len - IW_EV_LCP_LEN);
if(extra != NULL) if(extra != NULL)
memcpy(((char *) event) + hdr_len, extra, extra_len); memcpy(((char *) event) + hdr_len, extra, extra_len);
...@@ -1249,7 +1266,7 @@ void wireless_send_event(struct net_device * dev, ...@@ -1249,7 +1266,7 @@ void wireless_send_event(struct net_device * dev,
* Now, the driver can delegate this task to Wireless Extensions. * Now, the driver can delegate this task to Wireless Extensions.
* It needs to use those standard spy iw_handler in struct iw_handler_def, * It needs to use those standard spy iw_handler in struct iw_handler_def,
* push data to us via wireless_spy_update() and include struct iw_spy_data * push data to us via wireless_spy_update() and include struct iw_spy_data
* in its private part (and advertise it in iw_handler_def->spy_offset). * in its private part (and export it in net_device->wireless_data->spy_data).
* One of the main advantage of centralising spy support here is that * One of the main advantage of centralising spy support here is that
* it becomes much easier to improve and extend it without having to touch * it becomes much easier to improve and extend it without having to touch
* the drivers. One example is the addition of the Spy-Threshold events. * the drivers. One example is the addition of the Spy-Threshold events.
...@@ -1266,10 +1283,7 @@ static inline struct iw_spy_data * get_spydata(struct net_device *dev) ...@@ -1266,10 +1283,7 @@ static inline struct iw_spy_data * get_spydata(struct net_device *dev)
/* This is the new way */ /* This is the new way */
if(dev->wireless_data) if(dev->wireless_data)
return(dev->wireless_data->spy_data); return(dev->wireless_data->spy_data);
return NULL;
/* This is the old way. Doesn't work for multi-headed drivers.
* It will be removed in the next version of WE. */
return (dev->priv + dev->wireless_handlers->spy_offset);
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
...@@ -1284,10 +1298,6 @@ int iw_handler_set_spy(struct net_device * dev, ...@@ -1284,10 +1298,6 @@ int iw_handler_set_spy(struct net_device * dev,
struct iw_spy_data * spydata = get_spydata(dev); struct iw_spy_data * spydata = get_spydata(dev);
struct sockaddr * address = (struct sockaddr *) extra; struct sockaddr * address = (struct sockaddr *) extra;
if(!dev->wireless_data)
/* Help user know that driver needs updating */
printk(KERN_DEBUG "%s (WE) : Driver using old/buggy spy support, please fix driver !\n",
dev->name);
/* Make sure driver is not buggy or using the old API */ /* Make sure driver is not buggy or using the old API */
if(!spydata) if(!spydata)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -1318,7 +1328,7 @@ int iw_handler_set_spy(struct net_device * dev, ...@@ -1318,7 +1328,7 @@ int iw_handler_set_spy(struct net_device * dev,
sizeof(struct iw_quality) * IW_MAX_SPY); sizeof(struct iw_quality) * IW_MAX_SPY);
#ifdef WE_SPY_DEBUG #ifdef WE_SPY_DEBUG
printk(KERN_DEBUG "iw_handler_set_spy() : offset %ld, spydata %p, num %d\n", dev->wireless_handlers->spy_offset, spydata, wrqu->data.length); printk(KERN_DEBUG "iw_handler_set_spy() : wireless_data %p, spydata %p, num %d\n", dev->wireless_data, spydata, wrqu->data.length);
for (i = 0; i < wrqu->data.length; i++) for (i = 0; i < wrqu->data.length; i++)
printk(KERN_DEBUG printk(KERN_DEBUG
"%02X:%02X:%02X:%02X:%02X:%02X \n", "%02X:%02X:%02X:%02X:%02X:%02X \n",
...@@ -1371,7 +1381,7 @@ int iw_handler_get_spy(struct net_device * dev, ...@@ -1371,7 +1381,7 @@ int iw_handler_get_spy(struct net_device * dev,
sizeof(struct iw_quality) * spydata->spy_number); sizeof(struct iw_quality) * spydata->spy_number);
/* Reset updated flags. */ /* Reset updated flags. */
for(i = 0; i < spydata->spy_number; i++) for(i = 0; i < spydata->spy_number; i++)
spydata->spy_stat[i].updated = 0; spydata->spy_stat[i].updated &= ~IW_QUAL_ALL_UPDATED;
return 0; return 0;
} }
...@@ -1486,7 +1496,7 @@ void wireless_spy_update(struct net_device * dev, ...@@ -1486,7 +1496,7 @@ void wireless_spy_update(struct net_device * dev,
return; return;
#ifdef WE_SPY_DEBUG #ifdef WE_SPY_DEBUG
printk(KERN_DEBUG "wireless_spy_update() : offset %ld, spydata %p, address %02X:%02X:%02X:%02X:%02X:%02X\n", dev->wireless_handlers->spy_offset, spydata, address[0], address[1], address[2], address[3], address[4], address[5]); printk(KERN_DEBUG "wireless_spy_update() : wireless_data %p, spydata %p, address %02X:%02X:%02X:%02X:%02X:%02X\n", dev->wireless_data, spydata, address[0], address[1], address[2], address[3], address[4], address[5]);
#endif /* WE_SPY_DEBUG */ #endif /* WE_SPY_DEBUG */
/* Update all records that match */ /* Update all records that match */
......
...@@ -30,7 +30,6 @@ struct ieee80211_crypto_alg { ...@@ -30,7 +30,6 @@ struct ieee80211_crypto_alg {
struct ieee80211_crypto_ops *ops; struct ieee80211_crypto_ops *ops;
}; };
struct ieee80211_crypto { struct ieee80211_crypto {
struct list_head algs; struct list_head algs;
spinlock_t lock; spinlock_t lock;
...@@ -38,8 +37,7 @@ struct ieee80211_crypto { ...@@ -38,8 +37,7 @@ struct ieee80211_crypto {
static struct ieee80211_crypto *hcrypt; static struct ieee80211_crypto *hcrypt;
void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, int force)
int force)
{ {
struct list_head *ptr, *n; struct list_head *ptr, *n;
struct ieee80211_crypt_data *entry; struct ieee80211_crypt_data *entry;
...@@ -140,7 +138,7 @@ int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) ...@@ -140,7 +138,7 @@ int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops)
spin_lock_irqsave(&hcrypt->lock, flags); spin_lock_irqsave(&hcrypt->lock, flags);
for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) { for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
struct ieee80211_crypto_alg *alg = struct ieee80211_crypto_alg *alg =
(struct ieee80211_crypto_alg *) ptr; (struct ieee80211_crypto_alg *)ptr;
if (alg->ops == ops) { if (alg->ops == ops) {
list_del(&alg->list); list_del(&alg->list);
del_alg = alg; del_alg = alg;
...@@ -158,8 +156,7 @@ int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) ...@@ -158,8 +156,7 @@ int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops)
return del_alg ? 0 : -1; return del_alg ? 0 : -1;
} }
struct ieee80211_crypto_ops *ieee80211_get_crypto_ops(const char *name)
struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name)
{ {
unsigned long flags; unsigned long flags;
struct list_head *ptr; struct list_head *ptr;
...@@ -171,7 +168,7 @@ struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) ...@@ -171,7 +168,7 @@ struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name)
spin_lock_irqsave(&hcrypt->lock, flags); spin_lock_irqsave(&hcrypt->lock, flags);
for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) { for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
struct ieee80211_crypto_alg *alg = struct ieee80211_crypto_alg *alg =
(struct ieee80211_crypto_alg *) ptr; (struct ieee80211_crypto_alg *)ptr;
if (strcmp(alg->ops->name, name) == 0) { if (strcmp(alg->ops->name, name) == 0) {
found_alg = alg; found_alg = alg;
break; break;
...@@ -185,9 +182,13 @@ struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) ...@@ -185,9 +182,13 @@ struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name)
return NULL; return NULL;
} }
static void *ieee80211_crypt_null_init(int keyidx)
static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } {
static void ieee80211_crypt_null_deinit(void *priv) {} return (void *)1;
}
static void ieee80211_crypt_null_deinit(void *priv)
{
}
static struct ieee80211_crypto_ops ieee80211_crypt_null = { static struct ieee80211_crypto_ops ieee80211_crypt_null = {
.name = "NULL", .name = "NULL",
...@@ -204,7 +205,6 @@ static struct ieee80211_crypto_ops ieee80211_crypt_null = { ...@@ -204,7 +205,6 @@ static struct ieee80211_crypto_ops ieee80211_crypt_null = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
static int __init ieee80211_crypto_init(void) static int __init ieee80211_crypto_init(void)
{ {
int ret = -ENOMEM; int ret = -ENOMEM;
...@@ -222,11 +222,10 @@ static int __init ieee80211_crypto_init(void) ...@@ -222,11 +222,10 @@ static int __init ieee80211_crypto_init(void)
kfree(hcrypt); kfree(hcrypt);
hcrypt = NULL; hcrypt = NULL;
} }
out: out:
return ret; return ret;
} }
static void __exit ieee80211_crypto_deinit(void) static void __exit ieee80211_crypto_deinit(void)
{ {
struct list_head *ptr, *n; struct list_head *ptr, *n;
...@@ -237,7 +236,7 @@ static void __exit ieee80211_crypto_deinit(void) ...@@ -237,7 +236,7 @@ static void __exit ieee80211_crypto_deinit(void)
for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs; for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs;
ptr = n, n = ptr->next) { ptr = n, n = ptr->next) {
struct ieee80211_crypto_alg *alg = struct ieee80211_crypto_alg *alg =
(struct ieee80211_crypto_alg *) ptr; (struct ieee80211_crypto_alg *)ptr;
list_del(ptr); list_del(ptr);
printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm " printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
"'%s' (deinit)\n", alg->ops->name); "'%s' (deinit)\n", alg->ops->name);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment