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,13 +2729,17 @@ static void alarm_intr_handler(struct s2io_nic *nic) ...@@ -2689,13 +2729,17 @@ 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) {
/* Reset XframeI only if critical error */
if (val64 & (MC_ERR_REG_MIRI_ECC_DB_ERR_0 |
MC_ERR_REG_MIRI_ECC_DB_ERR_1)) {
netif_stop_queue(dev); netif_stop_queue(dev);
schedule_work(&nic->rst_timer_task); schedule_work(&nic->rst_timer_task);
} }
}
} else { } else {
nic->mac_control.stats_info->sw_stat. nic->mac_control.stats_info->sw_stat.
single_ecc_errs++; single_ecc_errs++;
...@@ -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);
......
This diff is collapsed.
...@@ -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 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.
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