Commit d72ec9e2 authored by Linus Torvalds's avatar Linus Torvalds

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

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6:
  spidernet MAINTAINERship update
  sky2: remove check for PCI wakeup setting from BIOS
  sky2: large memory workaround.
  fs_enet: check for phydev existence in the ethtool handlers
  [usb netdev] asix: fix regression
  r8169: fix missing loop variable increment
  ip1000: menu location change
  Fixed a small typo in the loopback driver
  3c509: PnP resource management fix
  netxen: fix byte-swapping in tx and rx
  netxen: optimize tx handling
  netxen: stop second phy correctly
  netxen: update driver version
  netxen: update MAINTAINERS
  endianness noise in tulip_core
  de4x5 fixes
  xircom_cb endianness fixes
  rt2x00: Put 802.11 data on 4 byte boundary
  rt2x00: Corectly initialize rt2500usb MAC
  rt2x00: Allow rt61 to catch up after a missing tx report
parents fd4be699 cb8da8a3
...@@ -2739,8 +2739,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git ...@@ -2739,8 +2739,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
S: Maintained S: Maintained
NETXEN (1/10) GbE SUPPORT NETXEN (1/10) GbE SUPPORT
P: Amit S. Kale P: Dhananjay Phadke
M: amitkale@netxen.com M: dhananjay@netxen.com
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
W: http://www.netxen.com W: http://www.netxen.com
S: Supported S: Supported
...@@ -3611,8 +3611,10 @@ L: linux-kernel@vger.kernel.org ? ...@@ -3611,8 +3611,10 @@ L: linux-kernel@vger.kernel.org ?
S: Supported S: Supported
SPIDERNET NETWORK DRIVER for CELL SPIDERNET NETWORK DRIVER for CELL
P: Linas Vepstas P: Ishizaki Kou
M: linas@austin.ibm.com M: kou.ishizaki@toshiba.co.jp
P: Jens Osterkamp
M: jens@de.ibm.com
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
......
...@@ -385,6 +385,7 @@ static int __init el3_probe(int card_idx) ...@@ -385,6 +385,7 @@ static int __init el3_probe(int card_idx)
#if defined(__ISAPNP__) #if defined(__ISAPNP__)
static int pnp_cards; static int pnp_cards;
struct pnp_dev *idev = NULL; struct pnp_dev *idev = NULL;
int pnp_found = 0;
if (nopnp == 1) if (nopnp == 1)
goto no_pnp; goto no_pnp;
...@@ -430,6 +431,7 @@ static int __init el3_probe(int card_idx) ...@@ -430,6 +431,7 @@ static int __init el3_probe(int card_idx)
pnp_cards++; pnp_cards++;
netdev_boot_setup_check(dev); netdev_boot_setup_check(dev);
pnp_found = 1;
goto found; goto found;
} }
} }
...@@ -560,6 +562,8 @@ static int __init el3_probe(int card_idx) ...@@ -560,6 +562,8 @@ static int __init el3_probe(int card_idx)
lp = netdev_priv(dev); lp = netdev_priv(dev);
#if defined(__ISAPNP__) #if defined(__ISAPNP__)
lp->dev = &idev->dev; lp->dev = &idev->dev;
if (pnp_found)
lp->type = EL3_PNP;
#endif #endif
err = el3_common_init(dev); err = el3_common_init(dev);
......
...@@ -166,16 +166,6 @@ config NET_SB1000 ...@@ -166,16 +166,6 @@ config NET_SB1000
If you don't have this card, of course say N. If you don't have this card, of course say N.
config IP1000
tristate "IP1000 Gigabit Ethernet support"
depends on PCI && EXPERIMENTAL
select MII
---help---
This driver supports IP1000 gigabit Ethernet cards.
To compile this driver as a module, choose M here: the module
will be called ipg. This is recommended.
source "drivers/net/arcnet/Kconfig" source "drivers/net/arcnet/Kconfig"
source "drivers/net/phy/Kconfig" source "drivers/net/phy/Kconfig"
...@@ -1992,6 +1982,16 @@ config E1000E ...@@ -1992,6 +1982,16 @@ config E1000E
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 e1000e. will be called e1000e.
config IP1000
tristate "IP1000 Gigabit Ethernet support"
depends on PCI && EXPERIMENTAL
select MII
---help---
This driver supports IP1000 gigabit Ethernet cards.
To compile this driver as a module, choose M here: the module
will be called ipg. This is recommended.
source "drivers/net/ixp2000/Kconfig" source "drivers/net/ixp2000/Kconfig"
config MYRI_SBUS config MYRI_SBUS
......
...@@ -894,14 +894,21 @@ static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs, ...@@ -894,14 +894,21 @@ static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs,
static int fs_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) static int fs_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
if (!fep->phydev)
return -ENODEV;
return phy_ethtool_gset(fep->phydev, cmd); return phy_ethtool_gset(fep->phydev, cmd);
} }
static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{ {
struct fs_enet_private *fep = netdev_priv(dev); struct fs_enet_private *fep = netdev_priv(dev);
phy_ethtool_sset(fep->phydev, cmd);
return 0; if (!fep->phydev)
return -ENODEV;
return phy_ethtool_sset(fep->phydev, cmd);
} }
static int fs_nway_reset(struct net_device *dev) static int fs_nway_reset(struct net_device *dev)
......
...@@ -242,7 +242,7 @@ static void loopback_setup(struct net_device *dev) ...@@ -242,7 +242,7 @@ static void loopback_setup(struct net_device *dev)
| NETIF_F_NO_CSUM | NETIF_F_NO_CSUM
| NETIF_F_HIGHDMA | NETIF_F_HIGHDMA
| NETIF_F_LLTX | NETIF_F_LLTX
| NETIF_F_NETNS_LOCAL, | NETIF_F_NETNS_LOCAL;
dev->ethtool_ops = &loopback_ethtool_ops; dev->ethtool_ops = &loopback_ethtool_ops;
dev->header_ops = &eth_header_ops; dev->header_ops = &eth_header_ops;
dev->init = loopback_dev_init; dev->init = loopback_dev_init;
......
...@@ -65,8 +65,8 @@ ...@@ -65,8 +65,8 @@
#define _NETXEN_NIC_LINUX_MAJOR 3 #define _NETXEN_NIC_LINUX_MAJOR 3
#define _NETXEN_NIC_LINUX_MINOR 4 #define _NETXEN_NIC_LINUX_MINOR 4
#define _NETXEN_NIC_LINUX_SUBVERSION 2 #define _NETXEN_NIC_LINUX_SUBVERSION 18
#define NETXEN_NIC_LINUX_VERSIONID "3.4.2" #define NETXEN_NIC_LINUX_VERSIONID "3.4.18"
#define NETXEN_NUM_FLASH_SECTORS (64) #define NETXEN_NUM_FLASH_SECTORS (64)
#define NETXEN_FLASH_SECTOR_SIZE (64 * 1024) #define NETXEN_FLASH_SECTOR_SIZE (64 * 1024)
...@@ -309,23 +309,26 @@ struct netxen_ring_ctx { ...@@ -309,23 +309,26 @@ struct netxen_ring_ctx {
((cmd_desc)->port_ctxid |= ((var) & 0xF0)) ((cmd_desc)->port_ctxid |= ((var) & 0xF0))
#define netxen_set_cmd_desc_flags(cmd_desc, val) \ #define netxen_set_cmd_desc_flags(cmd_desc, val) \
((cmd_desc)->flags_opcode &= ~cpu_to_le16(0x7f), \ (cmd_desc)->flags_opcode = ((cmd_desc)->flags_opcode & \
(cmd_desc)->flags_opcode |= cpu_to_le16((val) & 0x7f)) ~cpu_to_le16(0x7f)) | cpu_to_le16((val) & 0x7f)
#define netxen_set_cmd_desc_opcode(cmd_desc, val) \ #define netxen_set_cmd_desc_opcode(cmd_desc, val) \
((cmd_desc)->flags_opcode &= ~cpu_to_le16(0x3f<<7), \ (cmd_desc)->flags_opcode = ((cmd_desc)->flags_opcode & \
(cmd_desc)->flags_opcode |= cpu_to_le16(((val & 0x3f)<<7))) ~cpu_to_le16((u16)0x3f << 7)) | cpu_to_le16(((val) & 0x3f) << 7)
#define netxen_set_cmd_desc_num_of_buff(cmd_desc, val) \ #define netxen_set_cmd_desc_num_of_buff(cmd_desc, val) \
((cmd_desc)->num_of_buffers_total_length &= ~cpu_to_le32(0xff), \ (cmd_desc)->num_of_buffers_total_length = \
(cmd_desc)->num_of_buffers_total_length |= cpu_to_le32((val) & 0xff)) ((cmd_desc)->num_of_buffers_total_length & \
~cpu_to_le32(0xff)) | cpu_to_le32((val) & 0xff)
#define netxen_set_cmd_desc_totallength(cmd_desc, val) \ #define netxen_set_cmd_desc_totallength(cmd_desc, val) \
((cmd_desc)->num_of_buffers_total_length &= ~cpu_to_le32(0xffffff00), \ (cmd_desc)->num_of_buffers_total_length = \
(cmd_desc)->num_of_buffers_total_length |= cpu_to_le32(val << 8)) ((cmd_desc)->num_of_buffers_total_length & \
~cpu_to_le32((u32)0xffffff << 8)) | \
cpu_to_le32(((val) & 0xffffff) << 8)
#define netxen_get_cmd_desc_opcode(cmd_desc) \ #define netxen_get_cmd_desc_opcode(cmd_desc) \
((le16_to_cpu((cmd_desc)->flags_opcode) >> 7) & 0x003F) ((le16_to_cpu((cmd_desc)->flags_opcode) >> 7) & 0x003f)
#define netxen_get_cmd_desc_totallength(cmd_desc) \ #define netxen_get_cmd_desc_totallength(cmd_desc) \
(le32_to_cpu((cmd_desc)->num_of_buffers_total_length) >> 8) ((le32_to_cpu((cmd_desc)->num_of_buffers_total_length) >> 8) & 0xffffff)
struct cmd_desc_type0 { struct cmd_desc_type0 {
u8 tcp_hdr_offset; /* For LSO only */ u8 tcp_hdr_offset; /* For LSO only */
...@@ -412,29 +415,29 @@ struct rcv_desc { ...@@ -412,29 +415,29 @@ struct rcv_desc {
#define netxen_get_sts_desc_lro_last_frag(status_desc) \ #define netxen_get_sts_desc_lro_last_frag(status_desc) \
(((status_desc)->lro & 0x80) >> 7) (((status_desc)->lro & 0x80) >> 7)
#define netxen_get_sts_port(status_desc) \ #define netxen_get_sts_port(sts_data) \
(le64_to_cpu((status_desc)->status_desc_data) & 0x0F) ((sts_data) & 0x0F)
#define netxen_get_sts_status(status_desc) \ #define netxen_get_sts_status(sts_data) \
((le64_to_cpu((status_desc)->status_desc_data) >> 4) & 0x0F) (((sts_data) >> 4) & 0x0F)
#define netxen_get_sts_type(status_desc) \ #define netxen_get_sts_type(sts_data) \
((le64_to_cpu((status_desc)->status_desc_data) >> 8) & 0x0F) (((sts_data) >> 8) & 0x0F)
#define netxen_get_sts_totallength(status_desc) \ #define netxen_get_sts_totallength(sts_data) \
((le64_to_cpu((status_desc)->status_desc_data) >> 12) & 0xFFFF) (((sts_data) >> 12) & 0xFFFF)
#define netxen_get_sts_refhandle(status_desc) \ #define netxen_get_sts_refhandle(sts_data) \
((le64_to_cpu((status_desc)->status_desc_data) >> 28) & 0xFFFF) (((sts_data) >> 28) & 0xFFFF)
#define netxen_get_sts_prot(status_desc) \ #define netxen_get_sts_prot(sts_data) \
((le64_to_cpu((status_desc)->status_desc_data) >> 44) & 0x0F) (((sts_data) >> 44) & 0x0F)
#define netxen_get_sts_opcode(sts_data) \
(((sts_data) >> 58) & 0x03F)
#define netxen_get_sts_owner(status_desc) \ #define netxen_get_sts_owner(status_desc) \
((le64_to_cpu((status_desc)->status_desc_data) >> 56) & 0x03) ((le64_to_cpu((status_desc)->status_desc_data) >> 56) & 0x03)
#define netxen_get_sts_opcode(status_desc) \ #define netxen_set_sts_owner(status_desc, val) { \
((le64_to_cpu((status_desc)->status_desc_data) >> 58) & 0x03F) (status_desc)->status_desc_data = \
((status_desc)->status_desc_data & \
#define netxen_clear_sts_owner(status_desc) \ ~cpu_to_le64(0x3ULL << 56)) | \
((status_desc)->status_desc_data &= \ cpu_to_le64((u64)((val) & 0x3) << 56); \
~cpu_to_le64(((unsigned long long)3) << 56 )) }
#define netxen_set_sts_owner(status_desc, val) \
((status_desc)->status_desc_data |= \
cpu_to_le64(((unsigned long long)((val) & 0x3)) << 56 ))
struct status_desc { struct status_desc {
/* Bit pattern: 0-3 port, 4-7 status, 8-11 type, 12-27 total_length /* Bit pattern: 0-3 port, 4-7 status, 8-11 type, 12-27 total_length
......
...@@ -1070,16 +1070,17 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, ...@@ -1070,16 +1070,17 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
{ {
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
int index = netxen_get_sts_refhandle(desc); u64 sts_data = le64_to_cpu(desc->status_desc_data);
int index = netxen_get_sts_refhandle(sts_data);
struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]); struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]);
struct netxen_rx_buffer *buffer; struct netxen_rx_buffer *buffer;
struct sk_buff *skb; struct sk_buff *skb;
u32 length = netxen_get_sts_totallength(desc); u32 length = netxen_get_sts_totallength(sts_data);
u32 desc_ctx; u32 desc_ctx;
struct netxen_rcv_desc_ctx *rcv_desc; struct netxen_rcv_desc_ctx *rcv_desc;
int ret; int ret;
desc_ctx = netxen_get_sts_type(desc); desc_ctx = netxen_get_sts_type(sts_data);
if (unlikely(desc_ctx >= NUM_RCV_DESC_RINGS)) { if (unlikely(desc_ctx >= NUM_RCV_DESC_RINGS)) {
printk("%s: %s Bad Rcv descriptor ring\n", printk("%s: %s Bad Rcv descriptor ring\n",
netxen_nic_driver_name, netdev->name); netxen_nic_driver_name, netdev->name);
...@@ -1119,7 +1120,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, ...@@ -1119,7 +1120,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
skb = (struct sk_buff *)buffer->skb; skb = (struct sk_buff *)buffer->skb;
if (likely(adapter->rx_csum && if (likely(adapter->rx_csum &&
netxen_get_sts_status(desc) == STATUS_CKSUM_OK)) { netxen_get_sts_status(sts_data) == STATUS_CKSUM_OK)) {
adapter->stats.csummed++; adapter->stats.csummed++;
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
} else } else
...@@ -1209,7 +1210,6 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max) ...@@ -1209,7 +1210,6 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
break; break;
} }
netxen_process_rcv(adapter, ctxid, desc); netxen_process_rcv(adapter, ctxid, desc);
netxen_clear_sts_owner(desc);
netxen_set_sts_owner(desc, STATUS_OWNER_PHANTOM); netxen_set_sts_owner(desc, STATUS_OWNER_PHANTOM);
consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1); consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1);
count++; count++;
...@@ -1248,7 +1248,6 @@ int netxen_process_cmd_ring(unsigned long data) ...@@ -1248,7 +1248,6 @@ int netxen_process_cmd_ring(unsigned long data)
struct pci_dev *pdev; struct pci_dev *pdev;
struct netxen_skb_frag *frag; struct netxen_skb_frag *frag;
u32 i; u32 i;
struct sk_buff *skb = NULL;
int done; int done;
spin_lock(&adapter->tx_lock); spin_lock(&adapter->tx_lock);
...@@ -1278,9 +1277,8 @@ int netxen_process_cmd_ring(unsigned long data) ...@@ -1278,9 +1277,8 @@ int netxen_process_cmd_ring(unsigned long data)
while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) { while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) {
buffer = &adapter->cmd_buf_arr[last_consumer]; buffer = &adapter->cmd_buf_arr[last_consumer];
pdev = adapter->pdev; pdev = adapter->pdev;
frag = &buffer->frag_array[0]; if (buffer->skb) {
skb = buffer->skb; frag = &buffer->frag_array[0];
if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) {
pci_unmap_single(pdev, frag->dma, frag->length, pci_unmap_single(pdev, frag->dma, frag->length,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
frag->dma = 0ULL; frag->dma = 0ULL;
...@@ -1293,8 +1291,8 @@ int netxen_process_cmd_ring(unsigned long data) ...@@ -1293,8 +1291,8 @@ int netxen_process_cmd_ring(unsigned long data)
} }
adapter->stats.skbfreed++; adapter->stats.skbfreed++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(buffer->skb);
skb = NULL; buffer->skb = NULL;
} else if (adapter->proc_cmd_buf_counter == 1) { } else if (adapter->proc_cmd_buf_counter == 1) {
adapter->stats.txnullskb++; adapter->stats.txnullskb++;
} }
......
...@@ -732,11 +732,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) ...@@ -732,11 +732,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
unregister_netdev(netdev); unregister_netdev(netdev);
if (adapter->stop_port)
adapter->stop_port(adapter);
netxen_nic_disable_int(adapter);
if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
init_firmware_done++; init_firmware_done++;
netxen_free_hw_resources(adapter); netxen_free_hw_resources(adapter);
...@@ -919,6 +914,9 @@ static int netxen_nic_close(struct net_device *netdev) ...@@ -919,6 +914,9 @@ static int netxen_nic_close(struct net_device *netdev)
netif_stop_queue(netdev); netif_stop_queue(netdev);
napi_disable(&adapter->napi); napi_disable(&adapter->napi);
if (adapter->stop_port)
adapter->stop_port(adapter);
netxen_nic_disable_int(adapter); netxen_nic_disable_int(adapter);
cmd_buff = adapter->cmd_buf_arr; cmd_buff = adapter->cmd_buf_arr;
...@@ -996,28 +994,6 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -996,28 +994,6 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
/*
* Everything is set up. Now, we just need to transmit it out.
* Note that we have to copy the contents of buffer over to
* right place. Later on, this can be optimized out by de-coupling the
* producer index from the buffer index.
*/
retry_getting_window:
spin_lock_bh(&adapter->tx_lock);
if (adapter->total_threads >= MAX_XMIT_PRODUCERS) {
spin_unlock_bh(&adapter->tx_lock);
/*
* Yield CPU
*/
if (!in_atomic())
schedule();
else {
for (i = 0; i < 20; i++)
cpu_relax(); /*This a nop instr on i386 */
}
goto retry_getting_window;
}
local_producer = adapter->cmd_producer;
/* There 4 fragments per descriptor */ /* There 4 fragments per descriptor */
no_of_desc = (frag_count + 3) >> 2; no_of_desc = (frag_count + 3) >> 2;
if (netdev->features & NETIF_F_TSO) { if (netdev->features & NETIF_F_TSO) {
...@@ -1031,16 +1007,19 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -1031,16 +1007,19 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
} }
} }
} }
spin_lock_bh(&adapter->tx_lock);
if (adapter->total_threads >= MAX_XMIT_PRODUCERS) {
goto out_requeue;
}
local_producer = adapter->cmd_producer;
k = adapter->cmd_producer; k = adapter->cmd_producer;
max_tx_desc_count = adapter->max_tx_desc_count; max_tx_desc_count = adapter->max_tx_desc_count;
last_cmd_consumer = adapter->last_cmd_consumer; last_cmd_consumer = adapter->last_cmd_consumer;
if ((k + no_of_desc) >= if ((k + no_of_desc) >=
((last_cmd_consumer <= k) ? last_cmd_consumer + max_tx_desc_count : ((last_cmd_consumer <= k) ? last_cmd_consumer + max_tx_desc_count :
last_cmd_consumer)) { last_cmd_consumer)) {
netif_stop_queue(netdev); goto out_requeue;
adapter->flags |= NETXEN_NETDEV_STATUS;
spin_unlock_bh(&adapter->tx_lock);
return NETDEV_TX_BUSY;
} }
k = get_index_range(k, max_tx_desc_count, no_of_desc); k = get_index_range(k, max_tx_desc_count, no_of_desc);
adapter->cmd_producer = k; adapter->cmd_producer = k;
...@@ -1093,6 +1072,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -1093,6 +1072,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
adapter->max_tx_desc_count); adapter->max_tx_desc_count);
hwdesc = &hw->cmd_desc_head[producer]; hwdesc = &hw->cmd_desc_head[producer];
memset(hwdesc, 0, sizeof(struct cmd_desc_type0)); memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
pbuf = &adapter->cmd_buf_arr[producer];
pbuf->skb = NULL;
} }
frag = &skb_shinfo(skb)->frags[i - 1]; frag = &skb_shinfo(skb)->frags[i - 1];
len = frag->size; len = frag->size;
...@@ -1148,6 +1129,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -1148,6 +1129,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
} }
/* copy the MAC/IP/TCP headers to the cmd descriptor list */ /* copy the MAC/IP/TCP headers to the cmd descriptor list */
hwdesc = &hw->cmd_desc_head[producer]; hwdesc = &hw->cmd_desc_head[producer];
pbuf = &adapter->cmd_buf_arr[producer];
pbuf->skb = NULL;
/* copy the first 64 bytes */ /* copy the first 64 bytes */
memcpy(((void *)hwdesc) + 2, memcpy(((void *)hwdesc) + 2,
...@@ -1156,6 +1139,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -1156,6 +1139,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
if (more_hdr) { if (more_hdr) {
hwdesc = &hw->cmd_desc_head[producer]; hwdesc = &hw->cmd_desc_head[producer];
pbuf = &adapter->cmd_buf_arr[producer];
pbuf->skb = NULL;
/* copy the next 64 bytes - should be enough except /* copy the next 64 bytes - should be enough except
* for pathological case * for pathological case
*/ */
...@@ -1167,16 +1152,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -1167,16 +1152,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
} }
} }
i = netxen_get_cmd_desc_totallength(&hw->cmd_desc_head[saved_producer]);
hw->cmd_desc_head[saved_producer].flags_opcode =
cpu_to_le16(hw->cmd_desc_head[saved_producer].flags_opcode);
hw->cmd_desc_head[saved_producer].num_of_buffers_total_length =
cpu_to_le32(hw->cmd_desc_head[saved_producer].
num_of_buffers_total_length);
spin_lock_bh(&adapter->tx_lock); spin_lock_bh(&adapter->tx_lock);
adapter->stats.txbytes += i; adapter->stats.txbytes += skb->len;
/* Code to update the adapter considering how many producer threads /* Code to update the adapter considering how many producer threads
are currently working */ are currently working */
...@@ -1189,14 +1166,17 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -1189,14 +1166,17 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
} }
adapter->stats.xmitfinished++; adapter->stats.xmitfinished++;
spin_unlock_bh(&adapter->tx_lock);
netdev->trans_start = jiffies; netdev->trans_start = jiffies;
DPRINTK(INFO, "wrote CMD producer %x to phantom\n", producer); spin_unlock_bh(&adapter->tx_lock);
DPRINTK(INFO, "Done. Send\n");
return NETDEV_TX_OK; return NETDEV_TX_OK;
out_requeue:
netif_stop_queue(netdev);
adapter->flags |= NETXEN_NETDEV_STATUS;
spin_unlock_bh(&adapter->tx_lock);
return NETDEV_TX_BUSY;
} }
static void netxen_watchdog(unsigned long v) static void netxen_watchdog(unsigned long v)
......
...@@ -736,12 +736,12 @@ int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) ...@@ -736,12 +736,12 @@ int netxen_niu_disable_xg_port(struct netxen_adapter *adapter)
__u32 mac_cfg; __u32 mac_cfg;
u32 port = physical_port[adapter->portnum]; u32 port = physical_port[adapter->portnum];
if (port != 0) if (port > NETXEN_NIU_MAX_XG_PORTS)
return -EINVAL; return -EINVAL;
mac_cfg = 0; mac_cfg = 0;
netxen_xg_soft_reset(mac_cfg); if (netxen_nic_hw_write_wx(adapter,
if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_CONFIG_0, NETXEN_NIU_XGE_CONFIG_0 + (0x10000 * port), &mac_cfg, 4))
&mac_cfg, 4))
return -EIO; return -EIO;
return 0; return 0;
} }
......
...@@ -2002,7 +2002,7 @@ static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version) ...@@ -2002,7 +2002,7 @@ static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
u32 clk; u32 clk;
clk = RTL_R8(Config2) & PCI_Clock_66MHz; clk = RTL_R8(Config2) & PCI_Clock_66MHz;
for (i = 0; i < ARRAY_SIZE(cfg2_info); i++) { for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
if ((p->mac_version == mac_version) && (p->clk == clk)) { if ((p->mac_version == mac_version) && (p->clk == clk)) {
RTL_W32(0x7c, p->val); RTL_W32(0x7c, p->val);
break; break;
......
...@@ -944,7 +944,6 @@ static void tx_init(struct sky2_port *sky2) ...@@ -944,7 +944,6 @@ static void tx_init(struct sky2_port *sky2)
le = get_tx_le(sky2); le = get_tx_le(sky2);
le->addr = 0; le->addr = 0;
le->opcode = OP_ADDR64 | HW_OWNER; le->opcode = OP_ADDR64 | HW_OWNER;
sky2->tx_addr64 = 0;
} }
static inline struct tx_ring_info *tx_le_re(struct sky2_port *sky2, static inline struct tx_ring_info *tx_le_re(struct sky2_port *sky2,
...@@ -978,13 +977,11 @@ static void sky2_rx_add(struct sky2_port *sky2, u8 op, ...@@ -978,13 +977,11 @@ static void sky2_rx_add(struct sky2_port *sky2, u8 op,
dma_addr_t map, unsigned len) dma_addr_t map, unsigned len)
{ {
struct sky2_rx_le *le; struct sky2_rx_le *le;
u32 hi = upper_32_bits(map);
if (sky2->rx_addr64 != hi) { if (sizeof(dma_addr_t) > sizeof(u32)) {
le = sky2_next_rx(sky2); le = sky2_next_rx(sky2);
le->addr = cpu_to_le32(hi); le->addr = cpu_to_le32(upper_32_bits(map));
le->opcode = OP_ADDR64 | HW_OWNER; le->opcode = OP_ADDR64 | HW_OWNER;
sky2->rx_addr64 = upper_32_bits(map + len);
} }
le = sky2_next_rx(sky2); le = sky2_next_rx(sky2);
...@@ -1480,7 +1477,6 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) ...@@ -1480,7 +1477,6 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
struct tx_ring_info *re; struct tx_ring_info *re;
unsigned i, len; unsigned i, len;
dma_addr_t mapping; dma_addr_t mapping;
u32 addr64;
u16 mss; u16 mss;
u8 ctrl; u8 ctrl;
...@@ -1493,15 +1489,12 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) ...@@ -1493,15 +1489,12 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
len = skb_headlen(skb); len = skb_headlen(skb);
mapping = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE); mapping = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE);
addr64 = upper_32_bits(mapping);
/* Send high bits if changed or crosses boundary */ /* Send high bits if needed */
if (addr64 != sky2->tx_addr64 || if (sizeof(dma_addr_t) > sizeof(u32)) {
upper_32_bits(mapping + len) != sky2->tx_addr64) {
le = get_tx_le(sky2); le = get_tx_le(sky2);
le->addr = cpu_to_le32(addr64); le->addr = cpu_to_le32(upper_32_bits(mapping));
le->opcode = OP_ADDR64 | HW_OWNER; le->opcode = OP_ADDR64 | HW_OWNER;
sky2->tx_addr64 = upper_32_bits(mapping + len);
} }
/* Check for TCP Segmentation Offload */ /* Check for TCP Segmentation Offload */
...@@ -1582,13 +1575,12 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) ...@@ -1582,13 +1575,12 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
mapping = pci_map_page(hw->pdev, frag->page, frag->page_offset, mapping = pci_map_page(hw->pdev, frag->page, frag->page_offset,
frag->size, PCI_DMA_TODEVICE); frag->size, PCI_DMA_TODEVICE);
addr64 = upper_32_bits(mapping);
if (addr64 != sky2->tx_addr64) { if (sizeof(dma_addr_t) > sizeof(u32)) {
le = get_tx_le(sky2); le = get_tx_le(sky2);
le->addr = cpu_to_le32(addr64); le->addr = cpu_to_le32(upper_32_bits(mapping));
le->ctrl = 0; le->ctrl = 0;
le->opcode = OP_ADDR64 | HW_OWNER; le->opcode = OP_ADDR64 | HW_OWNER;
sky2->tx_addr64 = addr64;
} }
le = get_tx_le(sky2); le = get_tx_le(sky2);
...@@ -3957,7 +3949,7 @@ static __exit void sky2_debug_cleanup(void) ...@@ -3957,7 +3949,7 @@ static __exit void sky2_debug_cleanup(void)
/* Initialize network device */ /* Initialize network device */
static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
unsigned port, unsigned port,
int highmem, int wol) int highmem)
{ {
struct sky2_port *sky2; struct sky2_port *sky2;
struct net_device *dev = alloc_etherdev(sizeof(*sky2)); struct net_device *dev = alloc_etherdev(sizeof(*sky2));
...@@ -3997,7 +3989,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, ...@@ -3997,7 +3989,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
sky2->speed = -1; sky2->speed = -1;
sky2->advertising = sky2_supported_modes(hw); sky2->advertising = sky2_supported_modes(hw);
sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL); sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
sky2->wol = wol; sky2->wol = sky2_wol_supported(hw) & WAKE_MAGIC;
spin_lock_init(&sky2->phy_lock); spin_lock_init(&sky2->phy_lock);
sky2->tx_pending = TX_DEF_PENDING; sky2->tx_pending = TX_DEF_PENDING;
...@@ -4094,24 +4086,12 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw) ...@@ -4094,24 +4086,12 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw)
return err; return err;
} }
static int __devinit pci_wake_enabled(struct pci_dev *dev)
{
int pm = pci_find_capability(dev, PCI_CAP_ID_PM);
u16 value;
if (!pm)
return 0;
if (pci_read_config_word(dev, pm + PCI_PM_CTRL, &value))
return 0;
return value & PCI_PM_CTRL_PME_ENABLE;
}
static int __devinit sky2_probe(struct pci_dev *pdev, static int __devinit sky2_probe(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
struct net_device *dev; struct net_device *dev;
struct sky2_hw *hw; struct sky2_hw *hw;
int err, using_dac = 0, wol_default; int err, using_dac = 0;
err = pci_enable_device(pdev); err = pci_enable_device(pdev);
if (err) { if (err) {
...@@ -4144,8 +4124,6 @@ static int __devinit sky2_probe(struct pci_dev *pdev, ...@@ -4144,8 +4124,6 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
} }
} }
wol_default = pci_wake_enabled(pdev) ? WAKE_MAGIC : 0;
err = -ENOMEM; err = -ENOMEM;
hw = kzalloc(sizeof(*hw), GFP_KERNEL); hw = kzalloc(sizeof(*hw), GFP_KERNEL);
if (!hw) { if (!hw) {
...@@ -4189,7 +4167,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, ...@@ -4189,7 +4167,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
sky2_reset(hw); sky2_reset(hw);
dev = sky2_init_netdev(hw, 0, using_dac, wol_default); dev = sky2_init_netdev(hw, 0, using_dac);
if (!dev) { if (!dev) {
err = -ENOMEM; err = -ENOMEM;
goto err_out_free_pci; goto err_out_free_pci;
...@@ -4226,7 +4204,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, ...@@ -4226,7 +4204,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
if (hw->ports > 1) { if (hw->ports > 1) {
struct net_device *dev1; struct net_device *dev1;
dev1 = sky2_init_netdev(hw, 1, using_dac, wol_default); dev1 = sky2_init_netdev(hw, 1, using_dac);
if (!dev1) if (!dev1)
dev_warn(&pdev->dev, "allocation for second device failed\n"); dev_warn(&pdev->dev, "allocation for second device failed\n");
else if ((err = register_netdev(dev1))) { else if ((err = register_netdev(dev1))) {
......
...@@ -1991,14 +1991,14 @@ struct sky2_port { ...@@ -1991,14 +1991,14 @@ struct sky2_port {
u16 tx_cons; /* next le to check */ u16 tx_cons; /* next le to check */
u16 tx_prod; /* next le to use */ u16 tx_prod; /* next le to use */
u16 tx_next; /* debug only */ u16 tx_next; /* debug only */
u32 tx_addr64;
u16 tx_pending; u16 tx_pending;
u16 tx_last_mss; u16 tx_last_mss;
u32 tx_tcpsum; u32 tx_tcpsum;
struct rx_ring_info *rx_ring ____cacheline_aligned_in_smp; struct rx_ring_info *rx_ring ____cacheline_aligned_in_smp;
struct sky2_rx_le *rx_le; struct sky2_rx_le *rx_le;
u32 rx_addr64;
u16 rx_next; /* next re to check */ u16 rx_next; /* next re to check */
u16 rx_put; /* next le index to use */ u16 rx_put; /* next le index to use */
u16 rx_pending; u16 rx_pending;
......
...@@ -911,7 +911,7 @@ static int de4x5_init(struct net_device *dev); ...@@ -911,7 +911,7 @@ static int de4x5_init(struct net_device *dev);
static int de4x5_sw_reset(struct net_device *dev); static int de4x5_sw_reset(struct net_device *dev);
static int de4x5_rx(struct net_device *dev); static int de4x5_rx(struct net_device *dev);
static int de4x5_tx(struct net_device *dev); static int de4x5_tx(struct net_device *dev);
static int de4x5_ast(struct net_device *dev); static void de4x5_ast(struct net_device *dev);
static int de4x5_txur(struct net_device *dev); static int de4x5_txur(struct net_device *dev);
static int de4x5_rx_ovfc(struct net_device *dev); static int de4x5_rx_ovfc(struct net_device *dev);
...@@ -984,11 +984,9 @@ static int test_bad_enet(struct net_device *dev, int status); ...@@ -984,11 +984,9 @@ static int test_bad_enet(struct net_device *dev, int status);
static int an_exception(struct de4x5_private *lp); static int an_exception(struct de4x5_private *lp);
static char *build_setup_frame(struct net_device *dev, int mode); static char *build_setup_frame(struct net_device *dev, int mode);
static void disable_ast(struct net_device *dev); static void disable_ast(struct net_device *dev);
static void enable_ast(struct net_device *dev, u32 time_out);
static long de4x5_switch_mac_port(struct net_device *dev); static long de4x5_switch_mac_port(struct net_device *dev);
static int gep_rd(struct net_device *dev); static int gep_rd(struct net_device *dev);
static void gep_wr(s32 data, struct net_device *dev); static void gep_wr(s32 data, struct net_device *dev);
static void timeout(struct net_device *dev, void (*fn)(u_long data), u_long data, u_long msec);
static void yawn(struct net_device *dev, int state); static void yawn(struct net_device *dev, int state);
static void de4x5_parse_params(struct net_device *dev); static void de4x5_parse_params(struct net_device *dev);
static void de4x5_dbg_open(struct net_device *dev); static void de4x5_dbg_open(struct net_device *dev);
...@@ -1139,6 +1137,8 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) ...@@ -1139,6 +1137,8 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev)
lp->gendev = gendev; lp->gendev = gendev;
spin_lock_init(&lp->lock); spin_lock_init(&lp->lock);
init_timer(&lp->timer); init_timer(&lp->timer);
lp->timer.function = (void (*)(unsigned long))de4x5_ast;
lp->timer.data = (unsigned long)dev;
de4x5_parse_params(dev); de4x5_parse_params(dev);
/* /*
...@@ -1311,7 +1311,7 @@ de4x5_open(struct net_device *dev) ...@@ -1311,7 +1311,7 @@ de4x5_open(struct net_device *dev)
lp->state = OPEN; lp->state = OPEN;
de4x5_dbg_open(dev); de4x5_dbg_open(dev);
if (request_irq(dev->irq, (void *)de4x5_interrupt, IRQF_SHARED, if (request_irq(dev->irq, de4x5_interrupt, IRQF_SHARED,
lp->adapter_name, dev)) { lp->adapter_name, dev)) {
printk("de4x5_open(): Requested IRQ%d is busy - attemping FAST/SHARE...", dev->irq); printk("de4x5_open(): Requested IRQ%d is busy - attemping FAST/SHARE...", dev->irq);
if (request_irq(dev->irq, de4x5_interrupt, IRQF_DISABLED | IRQF_SHARED, if (request_irq(dev->irq, de4x5_interrupt, IRQF_DISABLED | IRQF_SHARED,
...@@ -1737,27 +1737,29 @@ de4x5_tx(struct net_device *dev) ...@@ -1737,27 +1737,29 @@ de4x5_tx(struct net_device *dev)
return 0; return 0;
} }
static int static void
de4x5_ast(struct net_device *dev) de4x5_ast(struct net_device *dev)
{ {
struct de4x5_private *lp = netdev_priv(dev); struct de4x5_private *lp = netdev_priv(dev);
int next_tick = DE4X5_AUTOSENSE_MS; int next_tick = DE4X5_AUTOSENSE_MS;
int dt;
disable_ast(dev); if (lp->useSROM)
next_tick = srom_autoconf(dev);
else if (lp->chipset == DC21140)
next_tick = dc21140m_autoconf(dev);
else if (lp->chipset == DC21041)
next_tick = dc21041_autoconf(dev);
else if (lp->chipset == DC21040)
next_tick = dc21040_autoconf(dev);
lp->linkOK = 0;
if (lp->useSROM) { dt = (next_tick * HZ) / 1000;
next_tick = srom_autoconf(dev);
} else if (lp->chipset == DC21140) {
next_tick = dc21140m_autoconf(dev);
} else if (lp->chipset == DC21041) {
next_tick = dc21041_autoconf(dev);
} else if (lp->chipset == DC21040) {
next_tick = dc21040_autoconf(dev);
}
lp->linkOK = 0;
enable_ast(dev, next_tick);
return 0; if (!dt)
dt = 1;
mod_timer(&lp->timer, jiffies + dt);
} }
static int static int
...@@ -2174,7 +2176,7 @@ srom_search(struct net_device *dev, struct pci_dev *pdev) ...@@ -2174,7 +2176,7 @@ srom_search(struct net_device *dev, struct pci_dev *pdev)
for (j=0, i=0; i<ETH_ALEN; i++) { for (j=0, i=0; i<ETH_ALEN; i++) {
j += (u_char) *((u_char *)&lp->srom + SROM_HWADD + i); j += (u_char) *((u_char *)&lp->srom + SROM_HWADD + i);
} }
if ((j != 0) && (j != 0x5fa)) { if (j != 0 && j != 6 * 0xff) {
last.chipset = device; last.chipset = device;
last.bus = pb; last.bus = pb;
last.irq = irq; last.irq = irq;
...@@ -2371,30 +2373,19 @@ static struct pci_driver de4x5_pci_driver = { ...@@ -2371,30 +2373,19 @@ static struct pci_driver de4x5_pci_driver = {
static int static int
autoconf_media(struct net_device *dev) autoconf_media(struct net_device *dev)
{ {
struct de4x5_private *lp = netdev_priv(dev); struct de4x5_private *lp = netdev_priv(dev);
u_long iobase = dev->base_addr; u_long iobase = dev->base_addr;
int next_tick = DE4X5_AUTOSENSE_MS;
lp->linkOK = 0; disable_ast(dev);
lp->c_media = AUTO; /* Bogus last media */
disable_ast(dev);
inl(DE4X5_MFC); /* Zero the lost frames counter */
lp->media = INIT;
lp->tcount = 0;
if (lp->useSROM) { lp->c_media = AUTO; /* Bogus last media */
next_tick = srom_autoconf(dev); inl(DE4X5_MFC); /* Zero the lost frames counter */
} else if (lp->chipset == DC21040) { lp->media = INIT;
next_tick = dc21040_autoconf(dev); lp->tcount = 0;
} else if (lp->chipset == DC21041) {
next_tick = dc21041_autoconf(dev);
} else if (lp->chipset == DC21140) {
next_tick = dc21140m_autoconf(dev);
}
enable_ast(dev, next_tick); de4x5_ast(dev);
return (lp->media); return lp->media;
} }
/* /*
...@@ -4018,20 +4009,22 @@ DevicePresent(struct net_device *dev, u_long aprom_addr) ...@@ -4018,20 +4009,22 @@ DevicePresent(struct net_device *dev, u_long aprom_addr)
outl(0, aprom_addr); /* Reset Ethernet Address ROM Pointer */ outl(0, aprom_addr); /* Reset Ethernet Address ROM Pointer */
} }
} else { /* Read new srom */ } else { /* Read new srom */
u_short tmp, *p = (short *)((char *)&lp->srom + SROM_HWADD); u_short tmp;
__le16 *p = (__le16 *)((char *)&lp->srom + SROM_HWADD);
for (i=0; i<(ETH_ALEN>>1); i++) { for (i=0; i<(ETH_ALEN>>1); i++) {
tmp = srom_rd(aprom_addr, (SROM_HWADD>>1) + i); tmp = srom_rd(aprom_addr, (SROM_HWADD>>1) + i);
*p = le16_to_cpu(tmp); j += tmp; /* for check for 0:0:0:0:0:0 or ff:ff:ff:ff:ff:ff */
j += *p++; *p = cpu_to_le16(tmp);
} }
if ((j == 0) || (j == 0x2fffd)) { if (j == 0 || j == 3 * 0xffff) {
return; /* could get 0 only from all-0 and 3 * 0xffff only from all-1 */
return;
} }
p=(short *)&lp->srom; p = (__le16 *)&lp->srom;
for (i=0; i<(sizeof(struct de4x5_srom)>>1); i++) { for (i=0; i<(sizeof(struct de4x5_srom)>>1); i++) {
tmp = srom_rd(aprom_addr, i); tmp = srom_rd(aprom_addr, i);
*p++ = le16_to_cpu(tmp); *p++ = cpu_to_le16(tmp);
} }
de4x5_dbg_srom((struct de4x5_srom *)&lp->srom); de4x5_dbg_srom((struct de4x5_srom *)&lp->srom);
} }
...@@ -5160,22 +5153,11 @@ build_setup_frame(struct net_device *dev, int mode) ...@@ -5160,22 +5153,11 @@ build_setup_frame(struct net_device *dev, int mode)
return pa; /* Points to the next entry */ return pa; /* Points to the next entry */
} }
static void
enable_ast(struct net_device *dev, u32 time_out)
{
timeout(dev, (void *)&de4x5_ast, (u_long)dev, time_out);
return;
}
static void static void
disable_ast(struct net_device *dev) disable_ast(struct net_device *dev)
{ {
struct de4x5_private *lp = netdev_priv(dev); struct de4x5_private *lp = netdev_priv(dev);
del_timer_sync(&lp->timer);
del_timer(&lp->timer);
return;
} }
static long static long
...@@ -5244,29 +5226,6 @@ gep_rd(struct net_device *dev) ...@@ -5244,29 +5226,6 @@ gep_rd(struct net_device *dev)
return 0; return 0;
} }
static void
timeout(struct net_device *dev, void (*fn)(u_long data), u_long data, u_long msec)
{
struct de4x5_private *lp = netdev_priv(dev);
int dt;
/* First, cancel any pending timer events */
del_timer(&lp->timer);
/* Convert msec to ticks */
dt = (msec * HZ) / 1000;
if (dt==0) dt=1;
/* Set up timer */
init_timer(&lp->timer);
lp->timer.expires = jiffies + dt;
lp->timer.function = fn;
lp->timer.data = data;
add_timer(&lp->timer);
return;
}
static void static void
yawn(struct net_device *dev, int state) yawn(struct net_device *dev, int state)
{ {
......
...@@ -797,7 +797,8 @@ static int tulip_close (struct net_device *dev) ...@@ -797,7 +797,8 @@ static int tulip_close (struct net_device *dev)
tp->rx_ring[i].status = 0; /* Not owned by Tulip chip. */ tp->rx_ring[i].status = 0; /* Not owned by Tulip chip. */
tp->rx_ring[i].length = 0; tp->rx_ring[i].length = 0;
tp->rx_ring[i].buffer1 = 0xBADF00D0; /* An invalid address. */ /* An invalid address. */
tp->rx_ring[i].buffer1 = cpu_to_le32(0xBADF00D0);
if (skb) { if (skb) {
pci_unmap_single(tp->pdev, mapping, PKT_BUF_SZ, pci_unmap_single(tp->pdev, mapping, PKT_BUF_SZ,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
......
...@@ -83,8 +83,8 @@ static int bufferoffsets[NUMDESCRIPTORS] = {128,2048,4096,6144}; ...@@ -83,8 +83,8 @@ static int bufferoffsets[NUMDESCRIPTORS] = {128,2048,4096,6144};
struct xircom_private { struct xircom_private {
/* Send and receive buffers, kernel-addressable and dma addressable forms */ /* Send and receive buffers, kernel-addressable and dma addressable forms */
unsigned int *rx_buffer; __le32 *rx_buffer;
unsigned int *tx_buffer; __le32 *tx_buffer;
dma_addr_t rx_dma_handle; dma_addr_t rx_dma_handle;
dma_addr_t tx_dma_handle; dma_addr_t tx_dma_handle;
...@@ -412,19 +412,20 @@ static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -412,19 +412,20 @@ static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* FIXME: The specification tells us that the length we send HAS to be a multiple of /* FIXME: The specification tells us that the length we send HAS to be a multiple of
4 bytes. */ 4 bytes. */
card->tx_buffer[4*desc+1] = skb->len; card->tx_buffer[4*desc+1] = cpu_to_le32(skb->len);
if (desc == NUMDESCRIPTORS-1) if (desc == NUMDESCRIPTORS - 1) /* bit 25: last descriptor of the ring */
card->tx_buffer[4*desc+1] |= (1<<25); /* bit 25: last descriptor of the ring */ card->tx_buffer[4*desc+1] |= cpu_to_le32(1<<25);
card->tx_buffer[4*desc+1] |= 0xF0000000; card->tx_buffer[4*desc+1] |= cpu_to_le32(0xF0000000);
/* 0xF0... means want interrupts*/ /* 0xF0... means want interrupts*/
card->tx_skb[desc] = skb; card->tx_skb[desc] = skb;
wmb(); wmb();
/* This gives the descriptor to the card */ /* This gives the descriptor to the card */
card->tx_buffer[4*desc] = 0x80000000; card->tx_buffer[4*desc] = cpu_to_le32(0x80000000);
trigger_transmit(card); trigger_transmit(card);
if (((int)card->tx_buffer[nextdescriptor*4])<0) { /* next descriptor is occupied... */ if (card->tx_buffer[nextdescriptor*4] & cpu_to_le32(0x8000000)) {
/* next descriptor is occupied... */
netif_stop_queue(dev); netif_stop_queue(dev);
} }
card->transmit_used = nextdescriptor; card->transmit_used = nextdescriptor;
...@@ -590,8 +591,7 @@ descriptors and programs the addresses into the card. ...@@ -590,8 +591,7 @@ descriptors and programs the addresses into the card.
*/ */
static void setup_descriptors(struct xircom_private *card) static void setup_descriptors(struct xircom_private *card)
{ {
unsigned int val; u32 address;
unsigned int address;
int i; int i;
enter("setup_descriptors"); enter("setup_descriptors");
...@@ -604,16 +604,16 @@ static void setup_descriptors(struct xircom_private *card) ...@@ -604,16 +604,16 @@ static void setup_descriptors(struct xircom_private *card)
for (i=0;i<NUMDESCRIPTORS;i++ ) { for (i=0;i<NUMDESCRIPTORS;i++ ) {
/* Rx Descr0: It's empty, let the card own it, no errors -> 0x80000000 */ /* Rx Descr0: It's empty, let the card own it, no errors -> 0x80000000 */
card->rx_buffer[i*4 + 0] = 0x80000000; card->rx_buffer[i*4 + 0] = cpu_to_le32(0x80000000);
/* Rx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */ /* Rx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
card->rx_buffer[i*4 + 1] = 1536; card->rx_buffer[i*4 + 1] = cpu_to_le32(1536);
if (i==NUMDESCRIPTORS-1) if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
card->rx_buffer[i*4 + 1] |= (1 << 25); /* bit 25 is "last descriptor" */ card->rx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
/* Rx Descr2: address of the buffer /* Rx Descr2: address of the buffer
we store the buffer at the 2nd half of the page */ we store the buffer at the 2nd half of the page */
address = (unsigned long) card->rx_dma_handle; address = card->rx_dma_handle;
card->rx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]); card->rx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
/* Rx Desc3: address of 2nd buffer -> 0 */ /* Rx Desc3: address of 2nd buffer -> 0 */
card->rx_buffer[i*4 + 3] = 0; card->rx_buffer[i*4 + 3] = 0;
...@@ -621,9 +621,8 @@ static void setup_descriptors(struct xircom_private *card) ...@@ -621,9 +621,8 @@ static void setup_descriptors(struct xircom_private *card)
wmb(); wmb();
/* Write the receive descriptor ring address to the card */ /* Write the receive descriptor ring address to the card */
address = (unsigned long) card->rx_dma_handle; address = card->rx_dma_handle;
val = cpu_to_le32(address); outl(address, card->io_port + CSR3); /* Receive descr list address */
outl(val, card->io_port + CSR3); /* Receive descr list address */
/* transmit descriptors */ /* transmit descriptors */
...@@ -633,13 +632,13 @@ static void setup_descriptors(struct xircom_private *card) ...@@ -633,13 +632,13 @@ static void setup_descriptors(struct xircom_private *card)
/* Tx Descr0: Empty, we own it, no errors -> 0x00000000 */ /* Tx Descr0: Empty, we own it, no errors -> 0x00000000 */
card->tx_buffer[i*4 + 0] = 0x00000000; card->tx_buffer[i*4 + 0] = 0x00000000;
/* Tx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */ /* Tx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
card->tx_buffer[i*4 + 1] = 1536; card->tx_buffer[i*4 + 1] = cpu_to_le32(1536);
if (i==NUMDESCRIPTORS-1) if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
card->tx_buffer[i*4 + 1] |= (1 << 25); /* bit 25 is "last descriptor" */ card->tx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
/* Tx Descr2: address of the buffer /* Tx Descr2: address of the buffer
we store the buffer at the 2nd half of the page */ we store the buffer at the 2nd half of the page */
address = (unsigned long) card->tx_dma_handle; address = card->tx_dma_handle;
card->tx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]); card->tx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
/* Tx Desc3: address of 2nd buffer -> 0 */ /* Tx Desc3: address of 2nd buffer -> 0 */
card->tx_buffer[i*4 + 3] = 0; card->tx_buffer[i*4 + 3] = 0;
...@@ -647,9 +646,8 @@ static void setup_descriptors(struct xircom_private *card) ...@@ -647,9 +646,8 @@ static void setup_descriptors(struct xircom_private *card)
wmb(); wmb();
/* wite the transmit descriptor ring to the card */ /* wite the transmit descriptor ring to the card */
address = (unsigned long) card->tx_dma_handle; address = card->tx_dma_handle;
val =cpu_to_le32(address); outl(address, card->io_port + CSR4); /* xmit descr list address */
outl(val, card->io_port + CSR4); /* xmit descr list address */
leave("setup_descriptors"); leave("setup_descriptors");
} }
...@@ -1180,7 +1178,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri ...@@ -1180,7 +1178,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
int status; int status;
enter("investigate_read_descriptor"); enter("investigate_read_descriptor");
status = card->rx_buffer[4*descnr]; status = le32_to_cpu(card->rx_buffer[4*descnr]);
if ((status > 0)) { /* packet received */ if ((status > 0)) { /* packet received */
...@@ -1210,7 +1208,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri ...@@ -1210,7 +1208,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
out: out:
/* give the buffer back to the card */ /* give the buffer back to the card */
card->rx_buffer[4*descnr] = 0x80000000; card->rx_buffer[4*descnr] = cpu_to_le32(0x80000000);
trigger_receive(card); trigger_receive(card);
} }
...@@ -1226,7 +1224,7 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p ...@@ -1226,7 +1224,7 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p
enter("investigate_write_descriptor"); enter("investigate_write_descriptor");
status = card->tx_buffer[4*descnr]; status = le32_to_cpu(card->tx_buffer[4*descnr]);
#if 0 #if 0
if (status & 0x8000) { /* Major error */ if (status & 0x8000) { /* Major error */
printk(KERN_ERR "Major transmit error status %x \n", status); printk(KERN_ERR "Major transmit error status %x \n", status);
......
...@@ -202,10 +202,10 @@ static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, ...@@ -202,10 +202,10 @@ static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
buf, buf,
size, size,
USB_CTRL_GET_TIMEOUT); USB_CTRL_GET_TIMEOUT);
if (err >= 0 && err < size) if (err == size)
err = -EINVAL;
if (!err)
memcpy(data, buf, size); memcpy(data, buf, size);
else if (err >= 0)
err = -EINVAL;
kfree(buf); kfree(buf);
out: out:
......
...@@ -257,7 +257,7 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = { ...@@ -257,7 +257,7 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = {
static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev, static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev,
__le32 *mac) __le32 *mac)
{ {
rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, &mac, rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, mac,
(3 * sizeof(__le16))); (3 * sizeof(__le16)));
} }
......
...@@ -124,7 +124,10 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev) ...@@ -124,7 +124,10 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
struct data_entry *entry; struct data_entry *entry;
struct data_desc *rxd; struct data_desc *rxd;
struct sk_buff *skb; struct sk_buff *skb;
struct ieee80211_hdr *hdr;
struct rxdata_entry_desc desc; struct rxdata_entry_desc desc;
int header_size;
int align;
u32 word; u32 word;
while (1) { while (1) {
...@@ -138,17 +141,26 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev) ...@@ -138,17 +141,26 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
memset(&desc, 0x00, sizeof(desc)); memset(&desc, 0x00, sizeof(desc));
rt2x00dev->ops->lib->fill_rxdone(entry, &desc); rt2x00dev->ops->lib->fill_rxdone(entry, &desc);
hdr = (struct ieee80211_hdr *)entry->data_addr;
header_size =
ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));
/*
* The data behind the ieee80211 header must be
* aligned on a 4 byte boundary.
*/
align = NET_IP_ALIGN + (2 * (header_size % 4 == 0));
/* /*
* Allocate the sk_buffer, initialize it and copy * Allocate the sk_buffer, initialize it and copy
* all data into it. * all data into it.
*/ */
skb = dev_alloc_skb(desc.size + NET_IP_ALIGN); skb = dev_alloc_skb(desc.size + align);
if (!skb) if (!skb)
return; return;
skb_reserve(skb, NET_IP_ALIGN); skb_reserve(skb, align);
skb_put(skb, desc.size); memcpy(skb_put(skb, desc.size), entry->data_addr, desc.size);
memcpy(skb->data, entry->data_addr, desc.size);
/* /*
* Send the frame to rt2x00lib for further processing. * Send the frame to rt2x00lib for further processing.
......
...@@ -221,7 +221,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) ...@@ -221,7 +221,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
struct data_ring *ring = entry->ring; struct data_ring *ring = entry->ring;
struct rt2x00_dev *rt2x00dev = ring->rt2x00dev; struct rt2x00_dev *rt2x00dev = ring->rt2x00dev;
struct sk_buff *skb; struct sk_buff *skb;
struct ieee80211_hdr *hdr;
struct rxdata_entry_desc desc; struct rxdata_entry_desc desc;
int header_size;
int frame_size; int frame_size;
if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) || if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
...@@ -253,9 +255,20 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) ...@@ -253,9 +255,20 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
skb_put(skb, frame_size); skb_put(skb, frame_size);
/* /*
* Trim the skb_buffer to only contain the valid * The data behind the ieee80211 header must be
* frame data (so ignore the device's descriptor). * aligned on a 4 byte boundary.
* After that trim the entire buffer down to only
* contain the valid frame data excluding the device
* descriptor.
*/ */
hdr = (struct ieee80211_hdr *)entry->skb->data;
header_size =
ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));
if (header_size % 4 == 0) {
skb_push(entry->skb, 2);
memmove(entry->skb->data, entry->skb->data + 2, skb->len - 2);
}
skb_trim(entry->skb, desc.size); skb_trim(entry->skb, desc.size);
/* /*
......
...@@ -1738,6 +1738,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) ...@@ -1738,6 +1738,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
{ {
struct data_ring *ring; struct data_ring *ring;
struct data_entry *entry; struct data_entry *entry;
struct data_entry *entry_done;
struct data_desc *txd; struct data_desc *txd;
u32 word; u32 word;
u32 reg; u32 reg;
...@@ -1791,6 +1792,17 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) ...@@ -1791,6 +1792,17 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
!rt2x00_get_field32(word, TXD_W0_VALID)) !rt2x00_get_field32(word, TXD_W0_VALID))
return; return;
entry_done = rt2x00_get_data_entry_done(ring);
while (entry != entry_done) {
/* Catch up. Just report any entries we missed as
* failed. */
WARNING(rt2x00dev,
"TX status report missed for entry %p\n",
entry_done);
rt2x00lib_txdone(entry_done, TX_FAIL_OTHER, 0);
entry_done = rt2x00_get_data_entry_done(ring);
}
/* /*
* Obtain the status about this packet. * Obtain the status about this packet.
*/ */
......
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