mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'omap2-upstream' into devel
This commit is contained in:
commit
adf6d34e46
737 changed files with 24475 additions and 14528 deletions
|
|
@ -2635,7 +2635,7 @@ config NIU
|
|||
|
||||
config PASEMI_MAC
|
||||
tristate "PA Semi 1/10Gbit MAC"
|
||||
depends on PPC64 && PCI
|
||||
depends on PPC_PASEMI && PCI
|
||||
select PHYLIB
|
||||
select INET_LRO
|
||||
help
|
||||
|
|
|
|||
|
|
@ -2082,6 +2082,11 @@ static int __devinit b44_get_invariants(struct b44 *bp)
|
|||
addr = sdev->bus->sprom.et0mac;
|
||||
bp->phy_addr = sdev->bus->sprom.et0phyaddr;
|
||||
}
|
||||
/* Some ROMs have buggy PHY addresses with the high
|
||||
* bits set (sign extension?). Truncate them to a
|
||||
* valid PHY address. */
|
||||
bp->phy_addr &= 0x1F;
|
||||
|
||||
memcpy(bp->dev->dev_addr, addr, 6);
|
||||
|
||||
if (!is_valid_ether_addr(&bp->dev->dev_addr[0])){
|
||||
|
|
|
|||
|
|
@ -575,7 +575,6 @@ adjust_head:
|
|||
static int bf537mac_hard_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev)
|
||||
{
|
||||
struct bf537mac_local *lp = netdev_priv(dev);
|
||||
unsigned int data;
|
||||
|
||||
current_tx_ptr->skb = skb;
|
||||
|
|
@ -634,7 +633,6 @@ out:
|
|||
static void bf537mac_rx(struct net_device *dev)
|
||||
{
|
||||
struct sk_buff *skb, *new_skb;
|
||||
struct bf537mac_local *lp = netdev_priv(dev);
|
||||
unsigned short len;
|
||||
|
||||
/* allocate a new skb for next time receive */
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@
|
|||
#include "bnx2x.h"
|
||||
#include "bnx2x_init.h"
|
||||
|
||||
#define DRV_MODULE_VERSION "1.42.3"
|
||||
#define DRV_MODULE_RELDATE "2008/3/9"
|
||||
#define DRV_MODULE_VERSION "1.42.4"
|
||||
#define DRV_MODULE_RELDATE "2008/4/9"
|
||||
#define BNX2X_BC_VER 0x040200
|
||||
|
||||
/* Time in jiffies before concluding the transmitter is hung. */
|
||||
|
|
@ -6153,7 +6153,7 @@ static int bnx2x_function_init(struct bnx2x *bp, int mode)
|
|||
func, mode);
|
||||
REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET,
|
||||
0xffffffff);
|
||||
REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET,
|
||||
REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
|
||||
0xfffc);
|
||||
bnx2x_init_block(bp, MISC_COMMON_START, MISC_COMMON_END);
|
||||
|
||||
|
|
|
|||
|
|
@ -310,7 +310,7 @@ static inline int __check_agg_selection_timer(struct port *port)
|
|||
*/
|
||||
static inline void __get_rx_machine_lock(struct port *port)
|
||||
{
|
||||
spin_lock(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
||||
spin_lock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -320,7 +320,7 @@ static inline void __get_rx_machine_lock(struct port *port)
|
|||
*/
|
||||
static inline void __release_rx_machine_lock(struct port *port)
|
||||
{
|
||||
spin_unlock(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
||||
spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -678,12 +678,8 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon
|
|||
}
|
||||
|
||||
if (!list_empty(&bond->vlan_list)) {
|
||||
unsigned short vlan_id;
|
||||
int res = vlan_get_tag(skb, &vlan_id);
|
||||
if (!res) {
|
||||
if (!vlan_get_tag(skb, &client_info->vlan_id))
|
||||
client_info->tag = 1;
|
||||
client_info->vlan_id = vlan_id;
|
||||
}
|
||||
}
|
||||
|
||||
if (!client_info->assigned) {
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@ struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr)
|
|||
*/
|
||||
int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev)
|
||||
{
|
||||
unsigned short vlan_id;
|
||||
unsigned short uninitialized_var(vlan_id);
|
||||
|
||||
if (!list_empty(&bond->vlan_list) &&
|
||||
!(slave_dev->features & NETIF_F_HW_VLAN_TX) &&
|
||||
|
|
@ -4528,8 +4528,7 @@ static void bond_free_all(void)
|
|||
netif_tx_unlock_bh(bond_dev);
|
||||
/* Release the bonded slaves */
|
||||
bond_release_all(bond_dev);
|
||||
bond_deinit(bond_dev);
|
||||
unregister_netdevice(bond_dev);
|
||||
bond_destroy(bond);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
|
|
|||
|
|
@ -341,6 +341,7 @@ static ssize_t bonding_store_slaves(struct device *d,
|
|||
|
||||
if (command[0] == '-') {
|
||||
dev = NULL;
|
||||
original_mtu = 0;
|
||||
bond_for_each_slave(bond, slave, i)
|
||||
if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
|
||||
dev = slave->dev;
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@
|
|||
#include "bond_3ad.h"
|
||||
#include "bond_alb.h"
|
||||
|
||||
#define DRV_VERSION "3.2.4"
|
||||
#define DRV_RELDATE "January 28, 2008"
|
||||
#define DRV_VERSION "3.2.5"
|
||||
#define DRV_RELDATE "March 21, 2008"
|
||||
#define DRV_NAME "bonding"
|
||||
#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
|
||||
|
||||
|
|
|
|||
|
|
@ -557,9 +557,9 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
|
|||
|
||||
for (i = 0; i < SGE_RXQ_PER_SET; ++i)
|
||||
if (q->fl[i].desc) {
|
||||
spin_lock(&adapter->sge.reg_lock);
|
||||
spin_lock_irq(&adapter->sge.reg_lock);
|
||||
t3_sge_disable_fl(adapter, q->fl[i].cntxt_id);
|
||||
spin_unlock(&adapter->sge.reg_lock);
|
||||
spin_unlock_irq(&adapter->sge.reg_lock);
|
||||
free_rx_bufs(pdev, &q->fl[i]);
|
||||
kfree(q->fl[i].sdesc);
|
||||
dma_free_coherent(&pdev->dev,
|
||||
|
|
@ -570,9 +570,9 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
|
|||
|
||||
for (i = 0; i < SGE_TXQ_PER_SET; ++i)
|
||||
if (q->txq[i].desc) {
|
||||
spin_lock(&adapter->sge.reg_lock);
|
||||
spin_lock_irq(&adapter->sge.reg_lock);
|
||||
t3_sge_enable_ecntxt(adapter, q->txq[i].cntxt_id, 0);
|
||||
spin_unlock(&adapter->sge.reg_lock);
|
||||
spin_unlock_irq(&adapter->sge.reg_lock);
|
||||
if (q->txq[i].sdesc) {
|
||||
free_tx_desc(adapter, &q->txq[i],
|
||||
q->txq[i].in_use);
|
||||
|
|
@ -586,9 +586,9 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
|
|||
}
|
||||
|
||||
if (q->rspq.desc) {
|
||||
spin_lock(&adapter->sge.reg_lock);
|
||||
spin_lock_irq(&adapter->sge.reg_lock);
|
||||
t3_sge_disable_rspcntxt(adapter, q->rspq.cntxt_id);
|
||||
spin_unlock(&adapter->sge.reg_lock);
|
||||
spin_unlock_irq(&adapter->sge.reg_lock);
|
||||
dma_free_coherent(&pdev->dev,
|
||||
q->rspq.size * sizeof(struct rsp_desc),
|
||||
q->rspq.desc, q->rspq.phys_addr);
|
||||
|
|
@ -2667,7 +2667,7 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
|
|||
(16 * 1024) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) :
|
||||
MAX_FRAME_SIZE + 2 + sizeof(struct cpl_rx_pkt);
|
||||
|
||||
spin_lock(&adapter->sge.reg_lock);
|
||||
spin_lock_irq(&adapter->sge.reg_lock);
|
||||
|
||||
/* FL threshold comparison uses < */
|
||||
ret = t3_sge_init_rspcntxt(adapter, q->rspq.cntxt_id, irq_vec_idx,
|
||||
|
|
@ -2711,7 +2711,7 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
|
|||
goto err_unlock;
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->sge.reg_lock);
|
||||
spin_unlock_irq(&adapter->sge.reg_lock);
|
||||
|
||||
q->adap = adapter;
|
||||
q->netdev = dev;
|
||||
|
|
@ -2728,7 +2728,7 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
|
|||
return 0;
|
||||
|
||||
err_unlock:
|
||||
spin_unlock(&adapter->sge.reg_lock);
|
||||
spin_unlock_irq(&adapter->sge.reg_lock);
|
||||
err:
|
||||
t3_free_qset(adapter, q);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -798,8 +798,6 @@ dm9000_init_dm9000(struct net_device *dev)
|
|||
/* Set address filter table */
|
||||
dm9000_hash_table(dev);
|
||||
|
||||
/* Activate DM9000 */
|
||||
iow(db, DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);
|
||||
/* Enable TX/RX interrupt mask */
|
||||
iow(db, DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM);
|
||||
|
||||
|
|
@ -970,7 +968,7 @@ dm9000_interrupt(int irq, void *dev_id)
|
|||
struct dm9000_rxhdr {
|
||||
u8 RxPktReady;
|
||||
u8 RxStatus;
|
||||
u16 RxLen;
|
||||
__le16 RxLen;
|
||||
} __attribute__((__packed__));
|
||||
|
||||
/*
|
||||
|
|
@ -1197,6 +1195,7 @@ dm9000_hash_table(struct net_device *dev)
|
|||
int i, oft;
|
||||
u32 hash_val;
|
||||
u16 hash_table[4];
|
||||
u8 rcr = RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN;
|
||||
unsigned long flags;
|
||||
|
||||
dm9000_dbg(db, 1, "entering %s\n", __func__);
|
||||
|
|
@ -1213,6 +1212,12 @@ dm9000_hash_table(struct net_device *dev)
|
|||
/* broadcast address */
|
||||
hash_table[3] = 0x8000;
|
||||
|
||||
if (dev->flags & IFF_PROMISC)
|
||||
rcr |= RCR_PRMSC;
|
||||
|
||||
if (dev->flags & IFF_ALLMULTI)
|
||||
rcr |= RCR_ALL;
|
||||
|
||||
/* the multicast address in Hash Table : 64 bits */
|
||||
for (i = 0; i < mc_cnt; i++, mcptr = mcptr->next) {
|
||||
hash_val = ether_crc_le(6, mcptr->dmi_addr) & 0x3f;
|
||||
|
|
@ -1225,6 +1230,7 @@ dm9000_hash_table(struct net_device *dev)
|
|||
iow(db, oft++, hash_table[i] >> 8);
|
||||
}
|
||||
|
||||
iow(db, DM9000_RCR, rcr);
|
||||
spin_unlock_irqrestore(&db->lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -960,7 +960,7 @@ static void e100_get_defaults(struct nic *nic)
|
|||
|
||||
/* Template for a freshly allocated RFD */
|
||||
nic->blank_rfd.command = 0;
|
||||
nic->blank_rfd.rbd = 0xFFFFFFFF;
|
||||
nic->blank_rfd.rbd = cpu_to_le32(0xFFFFFFFF);
|
||||
nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
|
||||
|
||||
/* MII setup */
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
#include <asm/io.h>
|
||||
|
||||
#define DRV_NAME "ehea"
|
||||
#define DRV_VERSION "EHEA_0087"
|
||||
#define DRV_VERSION "EHEA_0089"
|
||||
|
||||
/* eHEA capability flags */
|
||||
#define DLPAR_PORT_ADD_REM 1
|
||||
|
|
|
|||
|
|
@ -3108,7 +3108,7 @@ struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
|
|||
dev->vlan_rx_add_vid = ehea_vlan_rx_add_vid;
|
||||
dev->vlan_rx_kill_vid = ehea_vlan_rx_kill_vid;
|
||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO
|
||||
| NETIF_F_HIGHDMA | NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_TX
|
||||
| NETIF_F_HIGHDMA | NETIF_F_IP_CSUM | NETIF_F_HW_VLAN_TX
|
||||
| NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER
|
||||
| NETIF_F_LLTX;
|
||||
dev->tx_timeout = &ehea_tx_watchdog;
|
||||
|
|
|
|||
|
|
@ -1057,6 +1057,7 @@ static int mpc52xx_fec_of_resume(struct of_device *op)
|
|||
#endif
|
||||
|
||||
static struct of_device_id mpc52xx_fec_match[] = {
|
||||
{ .type = "network", .compatible = "fsl,mpc5200b-fec", },
|
||||
{ .type = "network", .compatible = "fsl,mpc5200-fec", },
|
||||
{ .type = "network", .compatible = "mpc5200-fec", },
|
||||
{ }
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ static int mpc52xx_fec_mdio_remove(struct of_device *of)
|
|||
|
||||
static struct of_device_id mpc52xx_fec_mdio_match[] = {
|
||||
{ .compatible = "fsl,mpc5200b-mdio", },
|
||||
{ .compatible = "fsl,mpc5200-mdio", },
|
||||
{ .compatible = "mpc5200b-fec-phy", },
|
||||
{}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1854,6 +1854,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct ring_desc* start_tx;
|
||||
struct ring_desc* prev_tx;
|
||||
struct nv_skb_map* prev_tx_ctx;
|
||||
unsigned long flags;
|
||||
|
||||
/* add fragments to entries count */
|
||||
for (i = 0; i < fragments; i++) {
|
||||
|
|
@ -1863,10 +1864,10 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
empty_slots = nv_get_empty_tx_slots(np);
|
||||
if (unlikely(empty_slots <= entries)) {
|
||||
spin_lock_irq(&np->lock);
|
||||
spin_lock_irqsave(&np->lock, flags);
|
||||
netif_stop_queue(dev);
|
||||
np->tx_stop = 1;
|
||||
spin_unlock_irq(&np->lock);
|
||||
spin_unlock_irqrestore(&np->lock, flags);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
|
|
@ -1929,13 +1930,13 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
tx_flags_extra = skb->ip_summed == CHECKSUM_PARTIAL ?
|
||||
NV_TX2_CHECKSUM_L3 | NV_TX2_CHECKSUM_L4 : 0;
|
||||
|
||||
spin_lock_irq(&np->lock);
|
||||
spin_lock_irqsave(&np->lock, flags);
|
||||
|
||||
/* set tx flags */
|
||||
start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra);
|
||||
np->put_tx.orig = put_tx;
|
||||
|
||||
spin_unlock_irq(&np->lock);
|
||||
spin_unlock_irqrestore(&np->lock, flags);
|
||||
|
||||
dprintk(KERN_DEBUG "%s: nv_start_xmit: entries %d queued for transmission. tx_flags_extra: %x\n",
|
||||
dev->name, entries, tx_flags_extra);
|
||||
|
|
@ -1971,6 +1972,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
|
|||
struct ring_desc_ex* prev_tx;
|
||||
struct nv_skb_map* prev_tx_ctx;
|
||||
struct nv_skb_map* start_tx_ctx;
|
||||
unsigned long flags;
|
||||
|
||||
/* add fragments to entries count */
|
||||
for (i = 0; i < fragments; i++) {
|
||||
|
|
@ -1980,10 +1982,10 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
empty_slots = nv_get_empty_tx_slots(np);
|
||||
if (unlikely(empty_slots <= entries)) {
|
||||
spin_lock_irq(&np->lock);
|
||||
spin_lock_irqsave(&np->lock, flags);
|
||||
netif_stop_queue(dev);
|
||||
np->tx_stop = 1;
|
||||
spin_unlock_irq(&np->lock);
|
||||
spin_unlock_irqrestore(&np->lock, flags);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
|
|
@ -2059,7 +2061,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
|
|||
start_tx->txvlan = 0;
|
||||
}
|
||||
|
||||
spin_lock_irq(&np->lock);
|
||||
spin_lock_irqsave(&np->lock, flags);
|
||||
|
||||
if (np->tx_limit) {
|
||||
/* Limit the number of outstanding tx. Setup all fragments, but
|
||||
|
|
@ -2085,7 +2087,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
|
|||
start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra);
|
||||
np->put_tx.ex = put_tx;
|
||||
|
||||
spin_unlock_irq(&np->lock);
|
||||
spin_unlock_irqrestore(&np->lock, flags);
|
||||
|
||||
dprintk(KERN_DEBUG "%s: nv_start_xmit_optimized: entries %d queued for transmission. tx_flags_extra: %x\n",
|
||||
dev->name, entries, tx_flags_extra);
|
||||
|
|
@ -2110,9 +2112,8 @@ static inline void nv_tx_flip_ownership(struct net_device *dev)
|
|||
|
||||
np->tx_pkts_in_progress--;
|
||||
if (np->tx_change_owner) {
|
||||
__le32 flaglen = le32_to_cpu(np->tx_change_owner->first_tx_desc->flaglen);
|
||||
flaglen |= NV_TX2_VALID;
|
||||
np->tx_change_owner->first_tx_desc->flaglen = cpu_to_le32(flaglen);
|
||||
np->tx_change_owner->first_tx_desc->flaglen |=
|
||||
cpu_to_le32(NV_TX2_VALID);
|
||||
np->tx_pkts_in_progress++;
|
||||
|
||||
np->tx_change_owner = np->tx_change_owner->next_tx_ctx;
|
||||
|
|
|
|||
|
|
@ -1242,8 +1242,8 @@ static int emac_close(struct net_device *ndev)
|
|||
static inline u16 emac_tx_csum(struct emac_instance *dev,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
if (emac_has_feature(dev, EMAC_FTR_HAS_TAH &&
|
||||
skb->ip_summed == CHECKSUM_PARTIAL)) {
|
||||
if (emac_has_feature(dev, EMAC_FTR_HAS_TAH) &&
|
||||
(skb->ip_summed == CHECKSUM_PARTIAL)) {
|
||||
++dev->stats.tx_packets_csum;
|
||||
return EMAC_TX_CTRL_TAH_CSUM;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,28 +61,28 @@
|
|||
/* Receive Descriptor - Advanced */
|
||||
union e1000_adv_rx_desc {
|
||||
struct {
|
||||
u64 pkt_addr; /* Packet buffer address */
|
||||
u64 hdr_addr; /* Header buffer address */
|
||||
__le64 pkt_addr; /* Packet buffer address */
|
||||
__le64 hdr_addr; /* Header buffer address */
|
||||
} read;
|
||||
struct {
|
||||
struct {
|
||||
struct {
|
||||
u16 pkt_info; /* RSS type, Packet type */
|
||||
u16 hdr_info; /* Split Header,
|
||||
* header buffer length */
|
||||
__le16 pkt_info; /* RSS type, Packet type */
|
||||
__le16 hdr_info; /* Split Header,
|
||||
* header buffer length */
|
||||
} lo_dword;
|
||||
union {
|
||||
u32 rss; /* RSS Hash */
|
||||
__le32 rss; /* RSS Hash */
|
||||
struct {
|
||||
u16 ip_id; /* IP id */
|
||||
u16 csum; /* Packet Checksum */
|
||||
__le16 ip_id; /* IP id */
|
||||
__le16 csum; /* Packet Checksum */
|
||||
} csum_ip;
|
||||
} hi_dword;
|
||||
} lower;
|
||||
struct {
|
||||
u32 status_error; /* ext status/error */
|
||||
u16 length; /* Packet length */
|
||||
u16 vlan; /* VLAN tag */
|
||||
__le32 status_error; /* ext status/error */
|
||||
__le16 length; /* Packet length */
|
||||
__le16 vlan; /* VLAN tag */
|
||||
} upper;
|
||||
} wb; /* writeback */
|
||||
};
|
||||
|
|
@ -97,14 +97,14 @@ union e1000_adv_rx_desc {
|
|||
/* Transmit Descriptor - Advanced */
|
||||
union e1000_adv_tx_desc {
|
||||
struct {
|
||||
u64 buffer_addr; /* Address of descriptor's data buf */
|
||||
u32 cmd_type_len;
|
||||
u32 olinfo_status;
|
||||
__le64 buffer_addr; /* Address of descriptor's data buf */
|
||||
__le32 cmd_type_len;
|
||||
__le32 olinfo_status;
|
||||
} read;
|
||||
struct {
|
||||
u64 rsvd; /* Reserved */
|
||||
u32 nxtseq_seed;
|
||||
u32 status;
|
||||
__le64 rsvd; /* Reserved */
|
||||
__le32 nxtseq_seed;
|
||||
__le32 status;
|
||||
} wb;
|
||||
};
|
||||
|
||||
|
|
@ -119,10 +119,10 @@ union e1000_adv_tx_desc {
|
|||
|
||||
/* Context descriptors */
|
||||
struct e1000_adv_tx_context_desc {
|
||||
u32 vlan_macip_lens;
|
||||
u32 seqnum_seed;
|
||||
u32 type_tucmd_mlhl;
|
||||
u32 mss_l4len_idx;
|
||||
__le32 vlan_macip_lens;
|
||||
__le32 seqnum_seed;
|
||||
__le32 type_tucmd_mlhl;
|
||||
__le32 mss_l4len_idx;
|
||||
};
|
||||
|
||||
#define E1000_ADVTXD_MACLEN_SHIFT 9 /* Adv ctxt desc mac len shift */
|
||||
|
|
|
|||
|
|
@ -143,35 +143,35 @@ enum e1000_fc_type {
|
|||
|
||||
/* Receive Descriptor */
|
||||
struct e1000_rx_desc {
|
||||
u64 buffer_addr; /* Address of the descriptor's data buffer */
|
||||
u16 length; /* Length of data DMAed into data buffer */
|
||||
u16 csum; /* Packet checksum */
|
||||
__le64 buffer_addr; /* Address of the descriptor's data buffer */
|
||||
__le16 length; /* Length of data DMAed into data buffer */
|
||||
__le16 csum; /* Packet checksum */
|
||||
u8 status; /* Descriptor status */
|
||||
u8 errors; /* Descriptor Errors */
|
||||
u16 special;
|
||||
__le16 special;
|
||||
};
|
||||
|
||||
/* Receive Descriptor - Extended */
|
||||
union e1000_rx_desc_extended {
|
||||
struct {
|
||||
u64 buffer_addr;
|
||||
u64 reserved;
|
||||
__le64 buffer_addr;
|
||||
__le64 reserved;
|
||||
} read;
|
||||
struct {
|
||||
struct {
|
||||
u32 mrq; /* Multiple Rx Queues */
|
||||
__le32 mrq; /* Multiple Rx Queues */
|
||||
union {
|
||||
u32 rss; /* RSS Hash */
|
||||
__le32 rss; /* RSS Hash */
|
||||
struct {
|
||||
u16 ip_id; /* IP id */
|
||||
u16 csum; /* Packet Checksum */
|
||||
__le16 ip_id; /* IP id */
|
||||
__le16 csum; /* Packet Checksum */
|
||||
} csum_ip;
|
||||
} hi_dword;
|
||||
} lower;
|
||||
struct {
|
||||
u32 status_error; /* ext status/error */
|
||||
u16 length;
|
||||
u16 vlan; /* VLAN tag */
|
||||
__le32 status_error; /* ext status/error */
|
||||
__le16 length;
|
||||
__le16 vlan; /* VLAN tag */
|
||||
} upper;
|
||||
} wb; /* writeback */
|
||||
};
|
||||
|
|
@ -181,49 +181,49 @@ union e1000_rx_desc_extended {
|
|||
union e1000_rx_desc_packet_split {
|
||||
struct {
|
||||
/* one buffer for protocol header(s), three data buffers */
|
||||
u64 buffer_addr[MAX_PS_BUFFERS];
|
||||
__le64 buffer_addr[MAX_PS_BUFFERS];
|
||||
} read;
|
||||
struct {
|
||||
struct {
|
||||
u32 mrq; /* Multiple Rx Queues */
|
||||
__le32 mrq; /* Multiple Rx Queues */
|
||||
union {
|
||||
u32 rss; /* RSS Hash */
|
||||
__le32 rss; /* RSS Hash */
|
||||
struct {
|
||||
u16 ip_id; /* IP id */
|
||||
u16 csum; /* Packet Checksum */
|
||||
__le16 ip_id; /* IP id */
|
||||
__le16 csum; /* Packet Checksum */
|
||||
} csum_ip;
|
||||
} hi_dword;
|
||||
} lower;
|
||||
struct {
|
||||
u32 status_error; /* ext status/error */
|
||||
u16 length0; /* length of buffer 0 */
|
||||
u16 vlan; /* VLAN tag */
|
||||
__le32 status_error; /* ext status/error */
|
||||
__le16 length0; /* length of buffer 0 */
|
||||
__le16 vlan; /* VLAN tag */
|
||||
} middle;
|
||||
struct {
|
||||
u16 header_status;
|
||||
u16 length[3]; /* length of buffers 1-3 */
|
||||
__le16 header_status;
|
||||
__le16 length[3]; /* length of buffers 1-3 */
|
||||
} upper;
|
||||
u64 reserved;
|
||||
__le64 reserved;
|
||||
} wb; /* writeback */
|
||||
};
|
||||
|
||||
/* Transmit Descriptor */
|
||||
struct e1000_tx_desc {
|
||||
u64 buffer_addr; /* Address of the descriptor's data buffer */
|
||||
__le64 buffer_addr; /* Address of the descriptor's data buffer */
|
||||
union {
|
||||
u32 data;
|
||||
__le32 data;
|
||||
struct {
|
||||
u16 length; /* Data buffer length */
|
||||
__le16 length; /* Data buffer length */
|
||||
u8 cso; /* Checksum offset */
|
||||
u8 cmd; /* Descriptor control */
|
||||
} flags;
|
||||
} lower;
|
||||
union {
|
||||
u32 data;
|
||||
__le32 data;
|
||||
struct {
|
||||
u8 status; /* Descriptor status */
|
||||
u8 css; /* Checksum start */
|
||||
u16 special;
|
||||
__le16 special;
|
||||
} fields;
|
||||
} upper;
|
||||
};
|
||||
|
|
@ -231,49 +231,49 @@ struct e1000_tx_desc {
|
|||
/* Offload Context Descriptor */
|
||||
struct e1000_context_desc {
|
||||
union {
|
||||
u32 ip_config;
|
||||
__le32 ip_config;
|
||||
struct {
|
||||
u8 ipcss; /* IP checksum start */
|
||||
u8 ipcso; /* IP checksum offset */
|
||||
u16 ipcse; /* IP checksum end */
|
||||
__le16 ipcse; /* IP checksum end */
|
||||
} ip_fields;
|
||||
} lower_setup;
|
||||
union {
|
||||
u32 tcp_config;
|
||||
__le32 tcp_config;
|
||||
struct {
|
||||
u8 tucss; /* TCP checksum start */
|
||||
u8 tucso; /* TCP checksum offset */
|
||||
u16 tucse; /* TCP checksum end */
|
||||
__le16 tucse; /* TCP checksum end */
|
||||
} tcp_fields;
|
||||
} upper_setup;
|
||||
u32 cmd_and_length;
|
||||
__le32 cmd_and_length;
|
||||
union {
|
||||
u32 data;
|
||||
__le32 data;
|
||||
struct {
|
||||
u8 status; /* Descriptor status */
|
||||
u8 hdr_len; /* Header length */
|
||||
u16 mss; /* Maximum segment size */
|
||||
__le16 mss; /* Maximum segment size */
|
||||
} fields;
|
||||
} tcp_seg_setup;
|
||||
};
|
||||
|
||||
/* Offload data descriptor */
|
||||
struct e1000_data_desc {
|
||||
u64 buffer_addr; /* Address of the descriptor's buffer address */
|
||||
__le64 buffer_addr; /* Address of the descriptor's buffer address */
|
||||
union {
|
||||
u32 data;
|
||||
__le32 data;
|
||||
struct {
|
||||
u16 length; /* Data buffer length */
|
||||
__le16 length; /* Data buffer length */
|
||||
u8 typ_len_ext;
|
||||
u8 cmd;
|
||||
} flags;
|
||||
} lower;
|
||||
union {
|
||||
u32 data;
|
||||
__le32 data;
|
||||
struct {
|
||||
u8 status; /* Descriptor status */
|
||||
u8 popts; /* Packet Options */
|
||||
u16 special;
|
||||
__le16 special;
|
||||
} fields;
|
||||
} upper;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3254,6 +3254,13 @@ quit_polling:
|
|||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline u32 get_head(struct igb_ring *tx_ring)
|
||||
{
|
||||
void *end = (struct e1000_tx_desc *)tx_ring->desc + tx_ring->count;
|
||||
return le32_to_cpu(*(volatile __le32 *)end);
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_clean_tx_irq - Reclaim resources after transmit completes
|
||||
* @adapter: board private structure
|
||||
|
|
@ -3275,9 +3282,7 @@ static bool igb_clean_tx_irq(struct igb_adapter *adapter,
|
|||
unsigned int total_bytes = 0, total_packets = 0;
|
||||
|
||||
rmb();
|
||||
head = *(volatile u32 *)((struct e1000_tx_desc *)tx_ring->desc
|
||||
+ tx_ring->count);
|
||||
head = le32_to_cpu(head);
|
||||
head = get_head(tx_ring);
|
||||
i = tx_ring->next_to_clean;
|
||||
while (1) {
|
||||
while (i != head) {
|
||||
|
|
@ -3312,9 +3317,7 @@ static bool igb_clean_tx_irq(struct igb_adapter *adapter,
|
|||
}
|
||||
oldhead = head;
|
||||
rmb();
|
||||
head = *(volatile u32 *)((struct e1000_tx_desc *)tx_ring->desc
|
||||
+ tx_ring->count);
|
||||
head = le32_to_cpu(head);
|
||||
head = get_head(tx_ring);
|
||||
if (head == oldhead)
|
||||
goto done_cleaning;
|
||||
} /* while (1) */
|
||||
|
|
@ -3388,7 +3391,7 @@ done_cleaning:
|
|||
* @vlan: descriptor vlan field as written by hardware (no le/be conversion)
|
||||
* @skb: pointer to sk_buff to be indicated to stack
|
||||
**/
|
||||
static void igb_receive_skb(struct igb_adapter *adapter, u8 status, u16 vlan,
|
||||
static void igb_receive_skb(struct igb_adapter *adapter, u8 status, __le16 vlan,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
|
||||
|
|
@ -3452,8 +3455,8 @@ static bool igb_clean_rx_irq_adv(struct igb_adapter *adapter,
|
|||
* that case, it fills the header buffer and spills the rest
|
||||
* into the page.
|
||||
*/
|
||||
hlen = le16_to_cpu((rx_desc->wb.lower.lo_dword.hdr_info &
|
||||
E1000_RXDADV_HDRBUFLEN_MASK) >> E1000_RXDADV_HDRBUFLEN_SHIFT);
|
||||
hlen = (le16_to_cpu(rx_desc->wb.lower.lo_dword.hdr_info) &
|
||||
E1000_RXDADV_HDRBUFLEN_MASK) >> E1000_RXDADV_HDRBUFLEN_SHIFT;
|
||||
if (hlen > adapter->rx_ps_hdr_size)
|
||||
hlen = adapter->rx_ps_hdr_size;
|
||||
|
||||
|
|
|
|||
|
|
@ -2088,14 +2088,12 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
|
|||
struct ixgb_buffer *buffer_info;
|
||||
struct sk_buff *skb;
|
||||
unsigned int i;
|
||||
int num_group_tail_writes;
|
||||
long cleancount;
|
||||
|
||||
i = rx_ring->next_to_use;
|
||||
buffer_info = &rx_ring->buffer_info[i];
|
||||
cleancount = IXGB_DESC_UNUSED(rx_ring);
|
||||
|
||||
num_group_tail_writes = IXGB_RX_BUFFER_WRITE;
|
||||
|
||||
/* leave three descriptors unused */
|
||||
while(--cleancount > 2) {
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@
|
|||
(sizeof(struct netxen_cmd_buffer) * adapter->max_tx_desc_count)
|
||||
#define RCV_BUFFSIZE \
|
||||
(sizeof(struct netxen_rx_buffer) * rcv_desc->max_rx_desc_count)
|
||||
#define find_diff_among(a,b,range) ((a)<=(b)?((b)-(a)):((b)+(range)-(a)))
|
||||
#define find_diff_among(a,b,range) ((a)<(b)?((b)-(a)):((b)+(range)-(a)))
|
||||
|
||||
#define NETXEN_NETDEV_STATUS 0x1
|
||||
#define NETXEN_RCV_PRODUCER_OFFSET 0
|
||||
|
|
@ -204,7 +204,7 @@ enum {
|
|||
? RCV_DESC_LRO : \
|
||||
(RCV_DESC_NORMAL)))
|
||||
|
||||
#define MAX_CMD_DESCRIPTORS 1024
|
||||
#define MAX_CMD_DESCRIPTORS 4096
|
||||
#define MAX_RCV_DESCRIPTORS 16384
|
||||
#define MAX_CMD_DESCRIPTORS_HOST (MAX_CMD_DESCRIPTORS / 4)
|
||||
#define MAX_RCV_DESCRIPTORS_1G (MAX_RCV_DESCRIPTORS / 4)
|
||||
|
|
@ -818,15 +818,8 @@ struct netxen_adapter_stats {
|
|||
u64 badskblen;
|
||||
u64 nocmddescriptor;
|
||||
u64 polled;
|
||||
u64 uphappy;
|
||||
u64 updropped;
|
||||
u64 uplcong;
|
||||
u64 uphcong;
|
||||
u64 upmcong;
|
||||
u64 updunno;
|
||||
u64 skbfreed;
|
||||
u64 rxdropped;
|
||||
u64 txdropped;
|
||||
u64 txnullskb;
|
||||
u64 csummed;
|
||||
u64 no_rcv;
|
||||
u64 rxbytes;
|
||||
|
|
@ -842,7 +835,6 @@ struct netxen_rcv_desc_ctx {
|
|||
u32 flags;
|
||||
u32 producer;
|
||||
u32 rcv_pending; /* Num of bufs posted in phantom */
|
||||
u32 rcv_free; /* Num of bufs in free list */
|
||||
dma_addr_t phys_addr;
|
||||
struct pci_dev *phys_pdev;
|
||||
struct rcv_desc *desc_head; /* address of rx ring in Phantom */
|
||||
|
|
@ -889,8 +881,6 @@ struct netxen_adapter {
|
|||
int mtu;
|
||||
int portnum;
|
||||
|
||||
spinlock_t tx_lock;
|
||||
spinlock_t lock;
|
||||
struct work_struct watchdog_task;
|
||||
struct timer_list watchdog_timer;
|
||||
struct work_struct tx_timeout_task;
|
||||
|
|
@ -899,16 +889,12 @@ struct netxen_adapter {
|
|||
|
||||
u32 cmd_producer;
|
||||
__le32 *cmd_consumer;
|
||||
|
||||
u32 last_cmd_consumer;
|
||||
|
||||
u32 max_tx_desc_count;
|
||||
u32 max_rx_desc_count;
|
||||
u32 max_jumbo_rx_desc_count;
|
||||
u32 max_lro_rx_desc_count;
|
||||
/* Num of instances active on cmd buffer ring */
|
||||
u32 proc_cmd_buf_counter;
|
||||
|
||||
u32 num_threads, total_threads; /*Use to keep track of xmit threads */
|
||||
|
||||
u32 flags;
|
||||
u32 irq;
|
||||
|
|
@ -942,6 +928,7 @@ struct netxen_adapter {
|
|||
struct pci_dev *ctx_desc_pdev;
|
||||
dma_addr_t ctx_desc_phys_addr;
|
||||
int intr_scheme;
|
||||
int msi_mode;
|
||||
int (*enable_phy_interrupts) (struct netxen_adapter *);
|
||||
int (*disable_phy_interrupts) (struct netxen_adapter *);
|
||||
void (*handle_phy_intr) (struct netxen_adapter *);
|
||||
|
|
@ -1075,12 +1062,10 @@ void netxen_tso_check(struct netxen_adapter *adapter,
|
|||
struct cmd_desc_type0 *desc, struct sk_buff *skb);
|
||||
int netxen_nic_hw_resources(struct netxen_adapter *adapter);
|
||||
void netxen_nic_clear_stats(struct netxen_adapter *adapter);
|
||||
int netxen_nic_rx_has_work(struct netxen_adapter *adapter);
|
||||
int netxen_nic_tx_has_work(struct netxen_adapter *adapter);
|
||||
void netxen_watchdog_task(struct work_struct *work);
|
||||
void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx,
|
||||
u32 ringid);
|
||||
int netxen_process_cmd_ring(unsigned long data);
|
||||
int netxen_process_cmd_ring(struct netxen_adapter *adapter);
|
||||
u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctx, int max);
|
||||
void netxen_nic_set_multi(struct net_device *netdev);
|
||||
int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu);
|
||||
|
|
|
|||
|
|
@ -64,15 +64,7 @@ static const struct netxen_nic_stats netxen_nic_gstrings_stats[] = {
|
|||
{"bad_skb_len", NETXEN_NIC_STAT(stats.badskblen)},
|
||||
{"no_cmd_desc", NETXEN_NIC_STAT(stats.nocmddescriptor)},
|
||||
{"polled", NETXEN_NIC_STAT(stats.polled)},
|
||||
{"uphappy", NETXEN_NIC_STAT(stats.uphappy)},
|
||||
{"updropped", NETXEN_NIC_STAT(stats.updropped)},
|
||||
{"uplcong", NETXEN_NIC_STAT(stats.uplcong)},
|
||||
{"uphcong", NETXEN_NIC_STAT(stats.uphcong)},
|
||||
{"upmcong", NETXEN_NIC_STAT(stats.upmcong)},
|
||||
{"updunno", NETXEN_NIC_STAT(stats.updunno)},
|
||||
{"skb_freed", NETXEN_NIC_STAT(stats.skbfreed)},
|
||||
{"tx_dropped", NETXEN_NIC_STAT(stats.txdropped)},
|
||||
{"tx_null_skb", NETXEN_NIC_STAT(stats.txnullskb)},
|
||||
{"csummed", NETXEN_NIC_STAT(stats.csummed)},
|
||||
{"no_rcv", NETXEN_NIC_STAT(stats.no_rcv)},
|
||||
{"rx_bytes", NETXEN_NIC_STAT(stats.rxbytes)},
|
||||
|
|
|
|||
|
|
@ -456,6 +456,12 @@ enum {
|
|||
#define ISR_INT_MASK_SLOW (NETXEN_PCIX_PS_REG(PCIX_INT_MASK))
|
||||
#define ISR_INT_TARGET_STATUS (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS))
|
||||
#define ISR_INT_TARGET_MASK (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK))
|
||||
#define ISR_INT_TARGET_STATUS_F1 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F1))
|
||||
#define ISR_INT_TARGET_MASK_F1 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F1))
|
||||
#define ISR_INT_TARGET_STATUS_F2 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F2))
|
||||
#define ISR_INT_TARGET_MASK_F2 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F2))
|
||||
#define ISR_INT_TARGET_STATUS_F3 (NETXEN_PCIX_PS_REG(PCIX_TARGET_STATUS_F3))
|
||||
#define ISR_INT_TARGET_MASK_F3 (NETXEN_PCIX_PS_REG(PCIX_TARGET_MASK_F3))
|
||||
|
||||
#define NETXEN_PCI_MAPSIZE 128
|
||||
#define NETXEN_PCI_DDR_NET (0x00000000UL)
|
||||
|
|
@ -662,6 +668,12 @@ enum {
|
|||
|
||||
#define PCIX_TARGET_STATUS (0x10118)
|
||||
#define PCIX_TARGET_MASK (0x10128)
|
||||
#define PCIX_TARGET_STATUS_F1 (0x10160)
|
||||
#define PCIX_TARGET_MASK_F1 (0x10170)
|
||||
#define PCIX_TARGET_STATUS_F2 (0x10164)
|
||||
#define PCIX_TARGET_MASK_F2 (0x10174)
|
||||
#define PCIX_TARGET_STATUS_F3 (0x10168)
|
||||
#define PCIX_TARGET_MASK_F3 (0x10178)
|
||||
|
||||
#define PCIX_MSI_F0 (0x13000)
|
||||
#define PCIX_MSI_F1 (0x13004)
|
||||
|
|
|
|||
|
|
@ -398,6 +398,8 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
|
|||
NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW));
|
||||
printk(KERN_NOTICE "%s: FW capabilities:0x%x\n", netxen_nic_driver_name,
|
||||
adapter->intr_scheme);
|
||||
adapter->msi_mode = readl(
|
||||
NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_FW));
|
||||
DPRINTK(INFO, "Receive Peg ready too. starting stuff\n");
|
||||
|
||||
addr = netxen_alloc(adapter->ahw.pdev,
|
||||
|
|
|
|||
|
|
@ -145,6 +145,8 @@ int netxen_init_firmware(struct netxen_adapter *adapter)
|
|||
/* Window 1 call */
|
||||
writel(INTR_SCHEME_PERPORT,
|
||||
NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_HOST));
|
||||
writel(MSI_MODE_MULTIFUNC,
|
||||
NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_HOST));
|
||||
writel(MPORT_MULTI_FUNCTION_MODE,
|
||||
NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE));
|
||||
writel(PHAN_INITIALIZE_ACK,
|
||||
|
|
@ -183,7 +185,6 @@ void netxen_initialize_adapter_sw(struct netxen_adapter *adapter)
|
|||
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
|
||||
struct netxen_rx_buffer *rx_buf;
|
||||
rcv_desc = &adapter->recv_ctx[ctxid].rcv_desc[ring];
|
||||
rcv_desc->rcv_free = rcv_desc->max_rx_desc_count;
|
||||
rcv_desc->begin_alloc = 0;
|
||||
rx_buf = rcv_desc->rx_buf_arr;
|
||||
num_rx_bufs = rcv_desc->max_rx_desc_count;
|
||||
|
|
@ -974,28 +975,6 @@ int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int netxen_nic_rx_has_work(struct netxen_adapter *adapter)
|
||||
{
|
||||
int ctx;
|
||||
|
||||
for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
|
||||
struct netxen_recv_context *recv_ctx =
|
||||
&(adapter->recv_ctx[ctx]);
|
||||
u32 consumer;
|
||||
struct status_desc *desc_head;
|
||||
struct status_desc *desc;
|
||||
|
||||
consumer = recv_ctx->status_rx_consumer;
|
||||
desc_head = recv_ctx->rcv_status_desc_head;
|
||||
desc = &desc_head[consumer];
|
||||
|
||||
if (netxen_get_sts_owner(desc) & STATUS_OWNER_HOST)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netxen_nic_check_temp(struct netxen_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
|
@ -1038,7 +1017,6 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
|
|||
|
||||
void netxen_watchdog_task(struct work_struct *work)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
struct netxen_adapter *adapter =
|
||||
container_of(work, struct netxen_adapter, watchdog_task);
|
||||
|
||||
|
|
@ -1048,20 +1026,6 @@ void netxen_watchdog_task(struct work_struct *work)
|
|||
if (adapter->handle_phy_intr)
|
||||
adapter->handle_phy_intr(adapter);
|
||||
|
||||
netdev = adapter->netdev;
|
||||
if ((netif_running(netdev)) && !netif_carrier_ok(netdev) &&
|
||||
netxen_nic_link_ok(adapter) ) {
|
||||
printk(KERN_INFO "%s %s (port %d), Link is up\n",
|
||||
netxen_nic_driver_name, netdev->name, adapter->portnum);
|
||||
netif_carrier_on(netdev);
|
||||
netif_wake_queue(netdev);
|
||||
} else if(!(netif_running(netdev)) && netif_carrier_ok(netdev)) {
|
||||
printk(KERN_ERR "%s %s Link is Down\n",
|
||||
netxen_nic_driver_name, netdev->name);
|
||||
netif_carrier_off(netdev);
|
||||
netif_stop_queue(netdev);
|
||||
}
|
||||
|
||||
mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
|
||||
}
|
||||
|
||||
|
|
@ -1125,7 +1089,7 @@ static void netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
|
|||
skb = (struct sk_buff *)buffer->skb;
|
||||
|
||||
if (likely(adapter->rx_csum &&
|
||||
netxen_get_sts_status(sts_data) == STATUS_CKSUM_OK)) {
|
||||
netxen_get_sts_status(sts_data) == STATUS_CKSUM_OK)) {
|
||||
adapter->stats.csummed++;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
} else
|
||||
|
|
@ -1142,40 +1106,8 @@ static void netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
|
|||
skb->protocol = eth_type_trans(skb, netdev);
|
||||
|
||||
ret = netif_receive_skb(skb);
|
||||
|
||||
/*
|
||||
* RH: Do we need these stats on a regular basis. Can we get it from
|
||||
* Linux stats.
|
||||
*/
|
||||
switch (ret) {
|
||||
case NET_RX_SUCCESS:
|
||||
adapter->stats.uphappy++;
|
||||
break;
|
||||
|
||||
case NET_RX_CN_LOW:
|
||||
adapter->stats.uplcong++;
|
||||
break;
|
||||
|
||||
case NET_RX_CN_MOD:
|
||||
adapter->stats.upmcong++;
|
||||
break;
|
||||
|
||||
case NET_RX_CN_HIGH:
|
||||
adapter->stats.uphcong++;
|
||||
break;
|
||||
|
||||
case NET_RX_DROP:
|
||||
adapter->stats.updropped++;
|
||||
break;
|
||||
|
||||
default:
|
||||
adapter->stats.updunno++;
|
||||
break;
|
||||
}
|
||||
|
||||
netdev->last_rx = jiffies;
|
||||
|
||||
rcv_desc->rcv_free++;
|
||||
rcv_desc->rcv_pending--;
|
||||
|
||||
/*
|
||||
|
|
@ -1200,13 +1132,6 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
|
|||
u32 producer = 0;
|
||||
int count = 0, ring;
|
||||
|
||||
DPRINTK(INFO, "procesing receive\n");
|
||||
/*
|
||||
* we assume in this case that there is only one port and that is
|
||||
* port #1...changes need to be done in firmware to indicate port
|
||||
* number as part of the descriptor. This way we will be able to get
|
||||
* the netdev which is associated with that device.
|
||||
*/
|
||||
while (count < max) {
|
||||
desc = &desc_head[consumer];
|
||||
if (!(netxen_get_sts_owner(desc) & STATUS_OWNER_HOST)) {
|
||||
|
|
@ -1219,11 +1144,8 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
|
|||
consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1);
|
||||
count++;
|
||||
}
|
||||
if (count) {
|
||||
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
|
||||
netxen_post_rx_buffers_nodb(adapter, ctxid, ring);
|
||||
}
|
||||
}
|
||||
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++)
|
||||
netxen_post_rx_buffers_nodb(adapter, ctxid, ring);
|
||||
|
||||
/* update the consumer index in phantom */
|
||||
if (count) {
|
||||
|
|
@ -1233,108 +1155,60 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
|
|||
/* Window = 1 */
|
||||
writel(consumer,
|
||||
NETXEN_CRB_NORMALIZE(adapter,
|
||||
recv_crb_registers[adapter->portnum].
|
||||
recv_crb_registers[adapter->portnum].
|
||||
crb_rcv_status_consumer));
|
||||
wmb();
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* Process Command status ring */
|
||||
int netxen_process_cmd_ring(unsigned long data)
|
||||
int netxen_process_cmd_ring(struct netxen_adapter *adapter)
|
||||
{
|
||||
u32 last_consumer;
|
||||
u32 consumer;
|
||||
struct netxen_adapter *adapter = (struct netxen_adapter *)data;
|
||||
int count1 = 0;
|
||||
int count2 = 0;
|
||||
u32 last_consumer, consumer;
|
||||
int count = 0, i;
|
||||
struct netxen_cmd_buffer *buffer;
|
||||
struct pci_dev *pdev;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
struct netxen_skb_frag *frag;
|
||||
u32 i;
|
||||
int done;
|
||||
int done = 0;
|
||||
|
||||
spin_lock(&adapter->tx_lock);
|
||||
last_consumer = adapter->last_cmd_consumer;
|
||||
DPRINTK(INFO, "procesing xmit complete\n");
|
||||
/* we assume in this case that there is only one port and that is
|
||||
* port #1...changes need to be done in firmware to indicate port
|
||||
* number as part of the descriptor. This way we will be able to get
|
||||
* the netdev which is associated with that device.
|
||||
*/
|
||||
|
||||
consumer = le32_to_cpu(*(adapter->cmd_consumer));
|
||||
if (last_consumer == consumer) { /* Ring is empty */
|
||||
DPRINTK(INFO, "last_consumer %d == consumer %d\n",
|
||||
last_consumer, consumer);
|
||||
spin_unlock(&adapter->tx_lock);
|
||||
return 1;
|
||||
}
|
||||
|
||||
adapter->proc_cmd_buf_counter++;
|
||||
/*
|
||||
* Not needed - does not seem to be used anywhere.
|
||||
* adapter->cmd_consumer = consumer;
|
||||
*/
|
||||
spin_unlock(&adapter->tx_lock);
|
||||
|
||||
while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) {
|
||||
while (last_consumer != consumer) {
|
||||
buffer = &adapter->cmd_buf_arr[last_consumer];
|
||||
pdev = adapter->pdev;
|
||||
if (buffer->skb) {
|
||||
frag = &buffer->frag_array[0];
|
||||
pci_unmap_single(pdev, frag->dma, frag->length,
|
||||
PCI_DMA_TODEVICE);
|
||||
frag->dma = 0ULL;
|
||||
for (i = 1; i < buffer->frag_count; i++) {
|
||||
DPRINTK(INFO, "getting fragment no %d\n", i);
|
||||
frag++; /* Get the next frag */
|
||||
pci_unmap_page(pdev, frag->dma, frag->length,
|
||||
PCI_DMA_TODEVICE);
|
||||
frag->dma = 0ULL;
|
||||
}
|
||||
|
||||
adapter->stats.skbfreed++;
|
||||
adapter->stats.xmitfinished++;
|
||||
dev_kfree_skb_any(buffer->skb);
|
||||
buffer->skb = NULL;
|
||||
} else if (adapter->proc_cmd_buf_counter == 1) {
|
||||
adapter->stats.txnullskb++;
|
||||
}
|
||||
if (unlikely(netif_queue_stopped(adapter->netdev)
|
||||
&& netif_carrier_ok(adapter->netdev))
|
||||
&& ((jiffies - adapter->netdev->trans_start) >
|
||||
adapter->netdev->watchdog_timeo)) {
|
||||
SCHEDULE_WORK(&adapter->tx_timeout_task);
|
||||
}
|
||||
|
||||
last_consumer = get_next_index(last_consumer,
|
||||
adapter->max_tx_desc_count);
|
||||
count1++;
|
||||
if (++count >= MAX_STATUS_HANDLE)
|
||||
break;
|
||||
}
|
||||
|
||||
count2 = 0;
|
||||
spin_lock(&adapter->tx_lock);
|
||||
if ((--adapter->proc_cmd_buf_counter) == 0) {
|
||||
if (count) {
|
||||
adapter->last_cmd_consumer = last_consumer;
|
||||
while ((adapter->last_cmd_consumer != consumer)
|
||||
&& (count2 < MAX_STATUS_HANDLE)) {
|
||||
buffer =
|
||||
&adapter->cmd_buf_arr[adapter->last_cmd_consumer];
|
||||
count2++;
|
||||
if (buffer->skb)
|
||||
break;
|
||||
else
|
||||
adapter->last_cmd_consumer =
|
||||
get_next_index(adapter->last_cmd_consumer,
|
||||
adapter->max_tx_desc_count);
|
||||
}
|
||||
}
|
||||
if (count1 || count2) {
|
||||
if (netif_queue_stopped(adapter->netdev)
|
||||
&& (adapter->flags & NETXEN_NETDEV_STATUS)) {
|
||||
netif_wake_queue(adapter->netdev);
|
||||
adapter->flags &= ~NETXEN_NETDEV_STATUS;
|
||||
smp_mb();
|
||||
if (netif_queue_stopped(netdev) && netif_running(netdev)) {
|
||||
netif_tx_lock(netdev);
|
||||
netif_wake_queue(netdev);
|
||||
smp_mb();
|
||||
netif_tx_unlock(netdev);
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
|
@ -1350,16 +1224,9 @@ int netxen_process_cmd_ring(unsigned long data)
|
|||
* There is still a possible race condition and the host could miss an
|
||||
* interrupt. The card has to take care of this.
|
||||
*/
|
||||
if (adapter->last_cmd_consumer == consumer &&
|
||||
(((adapter->cmd_producer + 1) %
|
||||
adapter->max_tx_desc_count) == adapter->last_cmd_consumer)) {
|
||||
consumer = le32_to_cpu(*(adapter->cmd_consumer));
|
||||
}
|
||||
done = (adapter->last_cmd_consumer == consumer);
|
||||
consumer = le32_to_cpu(*(adapter->cmd_consumer));
|
||||
done = (last_consumer == consumer);
|
||||
|
||||
spin_unlock(&adapter->tx_lock);
|
||||
DPRINTK(INFO, "last consumer is %d in %s\n", last_consumer,
|
||||
__FUNCTION__);
|
||||
return (done);
|
||||
}
|
||||
|
||||
|
|
@ -1433,8 +1300,6 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
|
|||
rcv_desc->begin_alloc = index;
|
||||
rcv_desc->rcv_pending += count;
|
||||
rcv_desc->producer = producer;
|
||||
if (rcv_desc->rcv_free >= 32) {
|
||||
rcv_desc->rcv_free = 0;
|
||||
/* Window = 1 */
|
||||
writel((producer - 1) &
|
||||
(rcv_desc->max_rx_desc_count - 1),
|
||||
|
|
@ -1458,8 +1323,6 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid)
|
|||
writel(msg,
|
||||
DB_NORMALIZE(adapter,
|
||||
NETXEN_RCV_PRODUCER_OFFSET));
|
||||
wmb();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1523,8 +1386,6 @@ static void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter,
|
|||
rcv_desc->begin_alloc = index;
|
||||
rcv_desc->rcv_pending += count;
|
||||
rcv_desc->producer = producer;
|
||||
if (rcv_desc->rcv_free >= 32) {
|
||||
rcv_desc->rcv_free = 0;
|
||||
/* Window = 1 */
|
||||
writel((producer - 1) &
|
||||
(rcv_desc->max_rx_desc_count - 1),
|
||||
|
|
@ -1534,21 +1395,9 @@ static void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter,
|
|||
rcv_desc_crb[ringid].
|
||||
crb_rcv_producer_offset));
|
||||
wmb();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int netxen_nic_tx_has_work(struct netxen_adapter *adapter)
|
||||
{
|
||||
if (find_diff_among(adapter->last_cmd_consumer,
|
||||
adapter->cmd_producer,
|
||||
adapter->max_tx_desc_count) > 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void netxen_nic_clear_stats(struct netxen_adapter *adapter)
|
||||
{
|
||||
memset(&adapter->stats, 0, sizeof(adapter->stats));
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev)
|
|||
/* packet transmit problems */
|
||||
stats->tx_errors = adapter->stats.nocmddescriptor;
|
||||
/* no space in linux buffers */
|
||||
stats->rx_dropped = adapter->stats.updropped;
|
||||
stats->rx_dropped = adapter->stats.rxdropped;
|
||||
/* no space available in linux */
|
||||
stats->tx_dropped = adapter->stats.txdropped;
|
||||
|
||||
|
|
@ -193,14 +193,14 @@ int netxen_nic_link_ok(struct netxen_adapter *adapter)
|
|||
void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
u32 val, val1;
|
||||
u32 val;
|
||||
|
||||
/* WINDOW = 1 */
|
||||
val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE));
|
||||
val >>= (physical_port[adapter->portnum] * 8);
|
||||
val1 = val & 0xff;
|
||||
val &= 0xff;
|
||||
|
||||
if (adapter->ahw.xg_linkup == 1 && val1 != XG_LINK_UP) {
|
||||
if (adapter->ahw.xg_linkup == 1 && val != XG_LINK_UP) {
|
||||
printk(KERN_INFO "%s: %s NIC Link is down\n",
|
||||
netxen_nic_driver_name, netdev->name);
|
||||
adapter->ahw.xg_linkup = 0;
|
||||
|
|
@ -208,16 +208,7 @@ void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter)
|
|||
netif_carrier_off(netdev);
|
||||
netif_stop_queue(netdev);
|
||||
}
|
||||
/* read twice to clear sticky bits */
|
||||
/* WINDOW = 0 */
|
||||
netxen_nic_read_w0(adapter, NETXEN_NIU_XG_STATUS, &val1);
|
||||
netxen_nic_read_w0(adapter, NETXEN_NIU_XG_STATUS, &val1);
|
||||
|
||||
if ((val & 0xffb) != 0xffb) {
|
||||
printk(KERN_INFO "%s ISR: Sync/Align BAD: 0x%08x\n",
|
||||
netxen_nic_driver_name, val1);
|
||||
}
|
||||
} else if (adapter->ahw.xg_linkup == 0 && val1 == XG_LINK_UP) {
|
||||
} else if (adapter->ahw.xg_linkup == 0 && val == XG_LINK_UP) {
|
||||
printk(KERN_INFO "%s: %s NIC Link is up\n",
|
||||
netxen_nic_driver_name, netdev->name);
|
||||
adapter->ahw.xg_linkup = 1;
|
||||
|
|
|
|||
|
|
@ -63,12 +63,12 @@ static int netxen_nic_xmit_frame(struct sk_buff *, struct net_device *);
|
|||
static void netxen_tx_timeout(struct net_device *netdev);
|
||||
static void netxen_tx_timeout_task(struct work_struct *work);
|
||||
static void netxen_watchdog(unsigned long);
|
||||
static int netxen_handle_int(struct netxen_adapter *, struct net_device *);
|
||||
static int netxen_nic_poll(struct napi_struct *napi, int budget);
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
static void netxen_nic_poll_controller(struct net_device *netdev);
|
||||
#endif
|
||||
static irqreturn_t netxen_intr(int irq, void *data);
|
||||
static irqreturn_t netxen_msi_intr(int irq, void *data);
|
||||
|
||||
int physical_port[] = {0, 1, 2, 3};
|
||||
|
||||
|
|
@ -149,33 +149,30 @@ static void netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter,
|
|||
|
||||
#define ADAPTER_LIST_SIZE 12
|
||||
|
||||
static uint32_t msi_tgt_status[4] = {
|
||||
ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
|
||||
ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3
|
||||
};
|
||||
|
||||
static uint32_t sw_int_mask[4] = {
|
||||
CRB_SW_INT_MASK_0, CRB_SW_INT_MASK_1,
|
||||
CRB_SW_INT_MASK_2, CRB_SW_INT_MASK_3
|
||||
};
|
||||
|
||||
static void netxen_nic_disable_int(struct netxen_adapter *adapter)
|
||||
{
|
||||
uint32_t mask = 0x7ff;
|
||||
u32 mask = 0x7ff;
|
||||
int retries = 32;
|
||||
int port = adapter->portnum;
|
||||
int pci_fn = adapter->ahw.pci_func;
|
||||
|
||||
DPRINTK(1, INFO, "Entered ISR Disable \n");
|
||||
|
||||
switch (adapter->portnum) {
|
||||
case 0:
|
||||
writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
|
||||
break;
|
||||
case 1:
|
||||
writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
|
||||
break;
|
||||
case 2:
|
||||
writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
|
||||
break;
|
||||
case 3:
|
||||
writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
|
||||
break;
|
||||
}
|
||||
if (adapter->msi_mode != MSI_MODE_MULTIFUNC)
|
||||
writel(0x0, NETXEN_CRB_NORMALIZE(adapter, sw_int_mask[port]));
|
||||
|
||||
if (adapter->intr_scheme != -1 &&
|
||||
adapter->intr_scheme != INTR_SCHEME_PERPORT)
|
||||
writel(mask,PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
|
||||
|
||||
/* Window = 0 or 1 */
|
||||
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
|
||||
do {
|
||||
writel(0xffffffff,
|
||||
|
|
@ -190,14 +187,18 @@ static void netxen_nic_disable_int(struct netxen_adapter *adapter)
|
|||
printk(KERN_NOTICE "%s: Failed to disable interrupt completely\n",
|
||||
netxen_nic_driver_name);
|
||||
}
|
||||
} else {
|
||||
if (adapter->msi_mode == MSI_MODE_MULTIFUNC) {
|
||||
writel(0xffffffff, PCI_OFFSET_SECOND_RANGE(adapter,
|
||||
msi_tgt_status[pci_fn]));
|
||||
}
|
||||
}
|
||||
|
||||
DPRINTK(1, INFO, "Done with Disable Int\n");
|
||||
}
|
||||
|
||||
static void netxen_nic_enable_int(struct netxen_adapter *adapter)
|
||||
{
|
||||
u32 mask;
|
||||
int port = adapter->portnum;
|
||||
|
||||
DPRINTK(1, INFO, "Entered ISR Enable \n");
|
||||
|
||||
|
|
@ -218,20 +219,7 @@ static void netxen_nic_enable_int(struct netxen_adapter *adapter)
|
|||
writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
|
||||
}
|
||||
|
||||
switch (adapter->portnum) {
|
||||
case 0:
|
||||
writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
|
||||
break;
|
||||
case 1:
|
||||
writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
|
||||
break;
|
||||
case 2:
|
||||
writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
|
||||
break;
|
||||
case 3:
|
||||
writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
|
||||
break;
|
||||
}
|
||||
writel(0x1, NETXEN_CRB_NORMALIZE(adapter, sw_int_mask[port]));
|
||||
|
||||
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
|
||||
mask = 0xbff;
|
||||
|
|
@ -328,7 +316,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
adapter->ahw.pdev = pdev;
|
||||
adapter->ahw.pci_func = pci_func_id;
|
||||
spin_lock_init(&adapter->tx_lock);
|
||||
|
||||
/* remap phys address */
|
||||
mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
|
||||
|
|
@ -401,6 +388,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
/* this will be read from FW later */
|
||||
adapter->intr_scheme = -1;
|
||||
adapter->msi_mode = -1;
|
||||
|
||||
/* This will be reset for mezz cards */
|
||||
adapter->portnum = pci_func_id;
|
||||
|
|
@ -415,7 +403,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
netdev->set_mac_address = netxen_nic_set_mac;
|
||||
netdev->change_mtu = netxen_nic_change_mtu;
|
||||
netdev->tx_timeout = netxen_tx_timeout;
|
||||
netdev->watchdog_timeo = HZ;
|
||||
netdev->watchdog_timeo = 2*HZ;
|
||||
|
||||
netxen_nic_change_mtu(netdev, netdev->mtu);
|
||||
|
||||
|
|
@ -543,7 +531,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
adapter->watchdog_timer.data = (unsigned long)adapter;
|
||||
INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task);
|
||||
adapter->ahw.pdev = pdev;
|
||||
adapter->proc_cmd_buf_counter = 0;
|
||||
adapter->ahw.revision_id = pdev->revision;
|
||||
|
||||
/* make sure Window == 1 */
|
||||
|
|
@ -833,6 +820,8 @@ static int netxen_nic_open(struct net_device *netdev)
|
|||
struct netxen_adapter *adapter = (struct netxen_adapter *)netdev->priv;
|
||||
int err = 0;
|
||||
int ctx, ring;
|
||||
irq_handler_t handler;
|
||||
unsigned long flags = IRQF_SAMPLE_RANDOM;
|
||||
|
||||
if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) {
|
||||
err = netxen_init_firmware(adapter);
|
||||
|
|
@ -856,9 +845,14 @@ static int netxen_nic_open(struct net_device *netdev)
|
|||
netxen_post_rx_buffers(adapter, ctx, ring);
|
||||
}
|
||||
adapter->irq = adapter->ahw.pdev->irq;
|
||||
err = request_irq(adapter->ahw.pdev->irq, netxen_intr,
|
||||
IRQF_SHARED|IRQF_SAMPLE_RANDOM, netdev->name,
|
||||
adapter);
|
||||
if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
|
||||
handler = netxen_msi_intr;
|
||||
else {
|
||||
flags |= IRQF_SHARED;
|
||||
handler = netxen_intr;
|
||||
}
|
||||
err = request_irq(adapter->irq, handler,
|
||||
flags, netdev->name, adapter);
|
||||
if (err) {
|
||||
printk(KERN_ERR "request_irq failed with: %d\n", err);
|
||||
netxen_free_hw_resources(adapter);
|
||||
|
|
@ -867,21 +861,12 @@ static int netxen_nic_open(struct net_device *netdev)
|
|||
|
||||
adapter->is_up = NETXEN_ADAPTER_UP_MAGIC;
|
||||
}
|
||||
if (!adapter->driver_mismatch)
|
||||
mod_timer(&adapter->watchdog_timer, jiffies);
|
||||
|
||||
napi_enable(&adapter->napi);
|
||||
|
||||
netxen_nic_enable_int(adapter);
|
||||
|
||||
/* Done here again so that even if phantom sw overwrote it,
|
||||
* we set it */
|
||||
if (adapter->init_port
|
||||
&& adapter->init_port(adapter, adapter->portnum) != 0) {
|
||||
del_timer_sync(&adapter->watchdog_timer);
|
||||
printk(KERN_ERR "%s: Failed to initialize port %d\n",
|
||||
netxen_nic_driver_name, adapter->portnum);
|
||||
napi_disable(&adapter->napi);
|
||||
return -EIO;
|
||||
}
|
||||
if (adapter->macaddr_set)
|
||||
|
|
@ -893,6 +878,12 @@ static int netxen_nic_open(struct net_device *netdev)
|
|||
if (adapter->set_mtu)
|
||||
adapter->set_mtu(adapter, netdev->mtu);
|
||||
|
||||
if (!adapter->driver_mismatch)
|
||||
mod_timer(&adapter->watchdog_timer, jiffies);
|
||||
|
||||
napi_enable(&adapter->napi);
|
||||
netxen_nic_enable_int(adapter);
|
||||
|
||||
if (!adapter->driver_mismatch)
|
||||
netif_start_queue(netdev);
|
||||
|
||||
|
|
@ -958,41 +949,17 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
struct netxen_skb_frag *buffrag;
|
||||
unsigned int i;
|
||||
|
||||
u32 producer = 0;
|
||||
u32 producer, consumer;
|
||||
u32 saved_producer = 0;
|
||||
struct cmd_desc_type0 *hwdesc;
|
||||
int k;
|
||||
struct netxen_cmd_buffer *pbuf = NULL;
|
||||
static int dropped_packet = 0;
|
||||
int frag_count;
|
||||
u32 local_producer = 0;
|
||||
u32 max_tx_desc_count = 0;
|
||||
u32 last_cmd_consumer = 0;
|
||||
int no_of_desc;
|
||||
u32 num_txd = adapter->max_tx_desc_count;
|
||||
|
||||
adapter->stats.xmitcalled++;
|
||||
frag_count = skb_shinfo(skb)->nr_frags + 1;
|
||||
|
||||
if (unlikely(skb->len <= 0)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
adapter->stats.badskblen++;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
if (frag_count > MAX_BUFFERS_PER_CMD) {
|
||||
printk("%s: %s netxen_nic_xmit_frame: frag_count (%d) "
|
||||
"too large, can handle only %d frags\n",
|
||||
netxen_nic_driver_name, netdev->name,
|
||||
frag_count, MAX_BUFFERS_PER_CMD);
|
||||
adapter->stats.txdropped++;
|
||||
if ((++dropped_packet & 0xff) == 0xff)
|
||||
printk("%s: %s droppped packets = %d\n",
|
||||
netxen_nic_driver_name, netdev->name,
|
||||
dropped_packet);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
/* There 4 fragments per descriptor */
|
||||
no_of_desc = (frag_count + 3) >> 2;
|
||||
if (netdev->features & NETIF_F_TSO) {
|
||||
|
|
@ -1007,27 +974,16 @@ 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;
|
||||
producer = adapter->cmd_producer;
|
||||
smp_mb();
|
||||
consumer = adapter->last_cmd_consumer;
|
||||
if ((no_of_desc+2) > find_diff_among(producer, consumer, num_txd)) {
|
||||
netif_stop_queue(netdev);
|
||||
smp_mb();
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
local_producer = adapter->cmd_producer;
|
||||
k = adapter->cmd_producer;
|
||||
max_tx_desc_count = adapter->max_tx_desc_count;
|
||||
last_cmd_consumer = adapter->last_cmd_consumer;
|
||||
if ((k + no_of_desc) >=
|
||||
((last_cmd_consumer <= k) ? last_cmd_consumer + max_tx_desc_count :
|
||||
last_cmd_consumer)) {
|
||||
goto out_requeue;
|
||||
}
|
||||
k = get_index_range(k, max_tx_desc_count, no_of_desc);
|
||||
adapter->cmd_producer = k;
|
||||
adapter->total_threads++;
|
||||
adapter->num_threads++;
|
||||
|
||||
spin_unlock_bh(&adapter->tx_lock);
|
||||
/* Copy the descriptors into the hardware */
|
||||
producer = local_producer;
|
||||
saved_producer = producer;
|
||||
hwdesc = &hw->cmd_desc_head[producer];
|
||||
memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
|
||||
|
|
@ -1067,8 +1023,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
/* move to next desc. if there is a need */
|
||||
if ((i & 0x3) == 0) {
|
||||
k = 0;
|
||||
producer = get_next_index(producer,
|
||||
adapter->max_tx_desc_count);
|
||||
producer = get_next_index(producer, num_txd);
|
||||
hwdesc = &hw->cmd_desc_head[producer];
|
||||
memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
|
||||
pbuf = &adapter->cmd_buf_arr[producer];
|
||||
|
|
@ -1086,7 +1041,6 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
buffrag->dma = temp_dma;
|
||||
buffrag->length = temp_len;
|
||||
|
||||
DPRINTK(INFO, "for loop. i=%d k=%d\n", i, k);
|
||||
switch (k) {
|
||||
case 0:
|
||||
hwdesc->buffer1_length = cpu_to_le16(temp_len);
|
||||
|
|
@ -1107,7 +1061,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
}
|
||||
frag++;
|
||||
}
|
||||
producer = get_next_index(producer, adapter->max_tx_desc_count);
|
||||
producer = get_next_index(producer, num_txd);
|
||||
|
||||
/* might change opcode to TX_TCP_LSO */
|
||||
netxen_tso_check(adapter, &hw->cmd_desc_head[saved_producer], skb);
|
||||
|
|
@ -1134,7 +1088,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
/* copy the first 64 bytes */
|
||||
memcpy(((void *)hwdesc) + 2,
|
||||
(void *)(skb->data), first_hdr_len);
|
||||
producer = get_next_index(producer, max_tx_desc_count);
|
||||
producer = get_next_index(producer, num_txd);
|
||||
|
||||
if (more_hdr) {
|
||||
hwdesc = &hw->cmd_desc_head[producer];
|
||||
|
|
@ -1147,35 +1101,19 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
hwdesc,
|
||||
(hdr_len -
|
||||
first_hdr_len));
|
||||
producer = get_next_index(producer, max_tx_desc_count);
|
||||
producer = get_next_index(producer, num_txd);
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_bh(&adapter->tx_lock);
|
||||
adapter->cmd_producer = producer;
|
||||
adapter->stats.txbytes += skb->len;
|
||||
|
||||
/* Code to update the adapter considering how many producer threads
|
||||
are currently working */
|
||||
if ((--adapter->num_threads) == 0) {
|
||||
/* This is the last thread */
|
||||
u32 crb_producer = adapter->cmd_producer;
|
||||
netxen_nic_update_cmd_producer(adapter, crb_producer);
|
||||
wmb();
|
||||
adapter->total_threads = 0;
|
||||
}
|
||||
netxen_nic_update_cmd_producer(adapter, adapter->cmd_producer);
|
||||
|
||||
adapter->stats.xmitfinished++;
|
||||
adapter->stats.xmitcalled++;
|
||||
netdev->trans_start = jiffies;
|
||||
|
||||
spin_unlock_bh(&adapter->tx_lock);
|
||||
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)
|
||||
|
|
@ -1200,87 +1138,60 @@ static void netxen_tx_timeout_task(struct work_struct *work)
|
|||
printk(KERN_ERR "%s %s: transmit timeout, resetting.\n",
|
||||
netxen_nic_driver_name, adapter->netdev->name);
|
||||
|
||||
netxen_nic_close(adapter->netdev);
|
||||
netxen_nic_open(adapter->netdev);
|
||||
netxen_nic_disable_int(adapter);
|
||||
napi_disable(&adapter->napi);
|
||||
|
||||
adapter->netdev->trans_start = jiffies;
|
||||
|
||||
napi_enable(&adapter->napi);
|
||||
netxen_nic_enable_int(adapter);
|
||||
netif_wake_queue(adapter->netdev);
|
||||
}
|
||||
|
||||
static int
|
||||
netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev)
|
||||
static inline void
|
||||
netxen_handle_int(struct netxen_adapter *adapter)
|
||||
{
|
||||
u32 ret = 0;
|
||||
|
||||
DPRINTK(INFO, "Entered handle ISR\n");
|
||||
adapter->stats.ints++;
|
||||
|
||||
netxen_nic_disable_int(adapter);
|
||||
|
||||
if (netxen_nic_rx_has_work(adapter) || netxen_nic_tx_has_work(adapter)) {
|
||||
if (netif_rx_schedule_prep(netdev, &adapter->napi)) {
|
||||
/*
|
||||
* Interrupts are already disabled.
|
||||
*/
|
||||
__netif_rx_schedule(netdev, &adapter->napi);
|
||||
} else {
|
||||
static unsigned int intcount = 0;
|
||||
if ((++intcount & 0xfff) == 0xfff)
|
||||
DPRINTK(KERN_ERR
|
||||
"%s: %s interrupt %d while in poll\n",
|
||||
netxen_nic_driver_name, netdev->name,
|
||||
intcount);
|
||||
}
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
netxen_nic_enable_int(adapter);
|
||||
}
|
||||
|
||||
return ret;
|
||||
napi_schedule(&adapter->napi);
|
||||
}
|
||||
|
||||
/*
|
||||
* netxen_intr - Interrupt Handler
|
||||
* @irq: interrupt number
|
||||
* data points to adapter stucture (which may be handling more than 1 port
|
||||
*/
|
||||
irqreturn_t netxen_intr(int irq, void *data)
|
||||
{
|
||||
struct netxen_adapter *adapter = data;
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
u32 our_int = 0;
|
||||
|
||||
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
|
||||
our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
|
||||
/* not our interrupt */
|
||||
if ((our_int & (0x80 << adapter->portnum)) == 0)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
|
||||
/* not our interrupt */
|
||||
if ((our_int & (0x80 << adapter->portnum)) == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (adapter->intr_scheme == INTR_SCHEME_PERPORT) {
|
||||
/* claim interrupt */
|
||||
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
|
||||
writel(our_int & ~((u32)(0x80 << adapter->portnum)),
|
||||
writel(our_int & ~((u32)(0x80 << adapter->portnum)),
|
||||
NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
|
||||
}
|
||||
}
|
||||
|
||||
if (netif_running(netdev))
|
||||
netxen_handle_int(adapter, netdev);
|
||||
netxen_handle_int(adapter);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
irqreturn_t netxen_msi_intr(int irq, void *data)
|
||||
{
|
||||
struct netxen_adapter *adapter = data;
|
||||
|
||||
netxen_handle_int(adapter);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int netxen_nic_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct netxen_adapter *adapter = container_of(napi, struct netxen_adapter, napi);
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
int done = 1;
|
||||
int tx_complete;
|
||||
int ctx;
|
||||
int work_done;
|
||||
|
||||
DPRINTK(INFO, "polling for %d descriptors\n", *budget);
|
||||
tx_complete = netxen_process_cmd_ring(adapter);
|
||||
|
||||
work_done = 0;
|
||||
for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
|
||||
|
|
@ -1300,16 +1211,8 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
|
|||
budget / MAX_RCV_CTX);
|
||||
}
|
||||
|
||||
if (work_done >= budget)
|
||||
done = 0;
|
||||
|
||||
if (netxen_process_cmd_ring((unsigned long)adapter) == 0)
|
||||
done = 0;
|
||||
|
||||
DPRINTK(INFO, "new work_done: %d work_to_do: %d\n",
|
||||
work_done, work_to_do);
|
||||
if (done) {
|
||||
netif_rx_complete(netdev, napi);
|
||||
if ((work_done < budget) && tx_complete) {
|
||||
netif_rx_complete(adapter->netdev, &adapter->napi);
|
||||
netxen_nic_enable_int(adapter);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -126,8 +126,11 @@
|
|||
*/
|
||||
#define CRB_NIC_CAPABILITIES_HOST NETXEN_NIC_REG(0x1a8)
|
||||
#define CRB_NIC_CAPABILITIES_FW NETXEN_NIC_REG(0x1dc)
|
||||
#define CRB_NIC_MSI_MODE_HOST NETXEN_NIC_REG(0x270)
|
||||
#define CRB_NIC_MSI_MODE_FW NETXEN_NIC_REG(0x274)
|
||||
|
||||
#define INTR_SCHEME_PERPORT 0x1
|
||||
#define MSI_MODE_MULTIFUNC 0x1
|
||||
|
||||
/* used for ethtool tests */
|
||||
#define CRB_SCRATCHPAD_TEST NETXEN_NIC_REG(0x280)
|
||||
|
|
|
|||
|
|
@ -58,9 +58,25 @@
|
|||
#define MII_M1111_RX_DELAY 0x80
|
||||
#define MII_M1111_TX_DELAY 0x2
|
||||
#define MII_M1111_PHY_EXT_SR 0x1b
|
||||
#define MII_M1111_HWCFG_MODE_MASK 0xf
|
||||
#define MII_M1111_HWCFG_MODE_RGMII 0xb
|
||||
|
||||
#define MII_M1111_HWCFG_MODE_MASK 0xf
|
||||
#define MII_M1111_HWCFG_MODE_COPPER_RGMII 0xb
|
||||
#define MII_M1111_HWCFG_MODE_FIBER_RGMII 0x3
|
||||
#define MII_M1111_HWCFG_MODE_SGMII_NO_CLK 0x4
|
||||
#define MII_M1111_HWCFG_FIBER_COPPER_AUTO 0x8000
|
||||
#define MII_M1111_HWCFG_FIBER_COPPER_RES 0x2000
|
||||
|
||||
#define MII_M1111_COPPER 0
|
||||
#define MII_M1111_FIBER 1
|
||||
|
||||
#define MII_M1011_PHY_STATUS 0x11
|
||||
#define MII_M1011_PHY_STATUS_1000 0x8000
|
||||
#define MII_M1011_PHY_STATUS_100 0x4000
|
||||
#define MII_M1011_PHY_STATUS_SPD_MASK 0xc000
|
||||
#define MII_M1011_PHY_STATUS_FULLDUPLEX 0x2000
|
||||
#define MII_M1011_PHY_STATUS_RESOLVED 0x0800
|
||||
#define MII_M1011_PHY_STATUS_LINK 0x0400
|
||||
|
||||
|
||||
MODULE_DESCRIPTION("Marvell PHY driver");
|
||||
MODULE_AUTHOR("Andy Fleming");
|
||||
|
|
@ -141,12 +157,22 @@ static int marvell_config_aneg(struct phy_device *phydev)
|
|||
static int m88e1111_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
int temp;
|
||||
int mode;
|
||||
|
||||
/* Enable Fiber/Copper auto selection */
|
||||
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
|
||||
temp |= MII_M1111_HWCFG_FIBER_COPPER_AUTO;
|
||||
phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
|
||||
|
||||
temp = phy_read(phydev, MII_BMCR);
|
||||
temp |= BMCR_RESET;
|
||||
phy_write(phydev, MII_BMCR, temp);
|
||||
|
||||
if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)) {
|
||||
int temp;
|
||||
|
||||
temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
|
||||
if (temp < 0)
|
||||
|
|
@ -171,7 +197,13 @@ static int m88e1111_config_init(struct phy_device *phydev)
|
|||
return temp;
|
||||
|
||||
temp &= ~(MII_M1111_HWCFG_MODE_MASK);
|
||||
temp |= MII_M1111_HWCFG_MODE_RGMII;
|
||||
|
||||
mode = phy_read(phydev, MII_M1111_PHY_EXT_CR);
|
||||
|
||||
if (mode & MII_M1111_HWCFG_FIBER_COPPER_RES)
|
||||
temp |= MII_M1111_HWCFG_MODE_FIBER_RGMII;
|
||||
else
|
||||
temp |= MII_M1111_HWCFG_MODE_COPPER_RGMII;
|
||||
|
||||
err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
|
||||
if (err < 0)
|
||||
|
|
@ -179,8 +211,6 @@ static int m88e1111_config_init(struct phy_device *phydev)
|
|||
}
|
||||
|
||||
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
|
||||
int temp;
|
||||
|
||||
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
|
||||
if (temp < 0)
|
||||
return temp;
|
||||
|
|
@ -262,6 +292,93 @@ static int m88e1145_config_init(struct phy_device *phydev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* marvell_read_status
|
||||
*
|
||||
* Generic status code does not detect Fiber correctly!
|
||||
* Description:
|
||||
* Check the link, then figure out the current state
|
||||
* by comparing what we advertise with what the link partner
|
||||
* advertises. Start by checking the gigabit possibilities,
|
||||
* then move on to 10/100.
|
||||
*/
|
||||
static int marvell_read_status(struct phy_device *phydev)
|
||||
{
|
||||
int adv;
|
||||
int err;
|
||||
int lpa;
|
||||
int status = 0;
|
||||
|
||||
/* Update the link, but return if there
|
||||
* was an error */
|
||||
err = genphy_update_link(phydev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (AUTONEG_ENABLE == phydev->autoneg) {
|
||||
status = phy_read(phydev, MII_M1011_PHY_STATUS);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
lpa = phy_read(phydev, MII_LPA);
|
||||
if (lpa < 0)
|
||||
return lpa;
|
||||
|
||||
adv = phy_read(phydev, MII_ADVERTISE);
|
||||
if (adv < 0)
|
||||
return adv;
|
||||
|
||||
lpa &= adv;
|
||||
|
||||
if (status & MII_M1011_PHY_STATUS_FULLDUPLEX)
|
||||
phydev->duplex = DUPLEX_FULL;
|
||||
else
|
||||
phydev->duplex = DUPLEX_HALF;
|
||||
|
||||
status = status & MII_M1011_PHY_STATUS_SPD_MASK;
|
||||
phydev->pause = phydev->asym_pause = 0;
|
||||
|
||||
switch (status) {
|
||||
case MII_M1011_PHY_STATUS_1000:
|
||||
phydev->speed = SPEED_1000;
|
||||
break;
|
||||
|
||||
case MII_M1011_PHY_STATUS_100:
|
||||
phydev->speed = SPEED_100;
|
||||
break;
|
||||
|
||||
default:
|
||||
phydev->speed = SPEED_10;
|
||||
break;
|
||||
}
|
||||
|
||||
if (phydev->duplex == DUPLEX_FULL) {
|
||||
phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
|
||||
phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
|
||||
}
|
||||
} else {
|
||||
int bmcr = phy_read(phydev, MII_BMCR);
|
||||
|
||||
if (bmcr < 0)
|
||||
return bmcr;
|
||||
|
||||
if (bmcr & BMCR_FULLDPLX)
|
||||
phydev->duplex = DUPLEX_FULL;
|
||||
else
|
||||
phydev->duplex = DUPLEX_HALF;
|
||||
|
||||
if (bmcr & BMCR_SPEED1000)
|
||||
phydev->speed = SPEED_1000;
|
||||
else if (bmcr & BMCR_SPEED100)
|
||||
phydev->speed = SPEED_100;
|
||||
else
|
||||
phydev->speed = SPEED_10;
|
||||
|
||||
phydev->pause = phydev->asym_pause = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct phy_driver marvell_drivers[] = {
|
||||
{
|
||||
.phy_id = 0x01410c60,
|
||||
|
|
@ -296,7 +413,7 @@ static struct phy_driver marvell_drivers[] = {
|
|||
.flags = PHY_HAS_INTERRUPT,
|
||||
.config_init = &m88e1111_config_init,
|
||||
.config_aneg = &marvell_config_aneg,
|
||||
.read_status = &genphy_read_status,
|
||||
.read_status = &marvell_read_status,
|
||||
.ack_interrupt = &marvell_ack_interrupt,
|
||||
.config_intr = &marvell_config_intr,
|
||||
.driver = { .owner = THIS_MODULE },
|
||||
|
|
|
|||
|
|
@ -903,17 +903,18 @@ plip_interrupt(void *dev_id)
|
|||
struct net_local *nl;
|
||||
struct plip_local *rcv;
|
||||
unsigned char c0;
|
||||
unsigned long flags;
|
||||
|
||||
nl = netdev_priv(dev);
|
||||
rcv = &nl->rcv_data;
|
||||
|
||||
spin_lock_irq (&nl->lock);
|
||||
spin_lock_irqsave (&nl->lock, flags);
|
||||
|
||||
c0 = read_status(dev);
|
||||
if ((c0 & 0xf8) != 0xc0) {
|
||||
if ((dev->irq != -1) && (net_debug > 1))
|
||||
printk(KERN_DEBUG "%s: spurious interrupt\n", dev->name);
|
||||
spin_unlock_irq (&nl->lock);
|
||||
spin_unlock_irqrestore (&nl->lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -942,7 +943,7 @@ plip_interrupt(void *dev_id)
|
|||
break;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&nl->lock);
|
||||
spin_unlock_irqrestore(&nl->lock, flags);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@
|
|||
#include "s2io.h"
|
||||
#include "s2io-regs.h"
|
||||
|
||||
#define DRV_VERSION "2.0.26.15-2"
|
||||
#define DRV_VERSION "2.0.26.20"
|
||||
|
||||
/* S2io Driver name & version. */
|
||||
static char s2io_driver_name[] = "Neterion";
|
||||
|
|
@ -4172,6 +4172,9 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
dev->trans_start = jiffies;
|
||||
spin_unlock_irqrestore(&fifo->tx_lock, flags);
|
||||
|
||||
if (sp->config.intr_type == MSI_X)
|
||||
tx_intr_handler(fifo);
|
||||
|
||||
return 0;
|
||||
pci_map_failed:
|
||||
stats->pci_map_fail_cnt++;
|
||||
|
|
|
|||
|
|
@ -3199,12 +3199,14 @@ static int skge_poll(struct napi_struct *napi, int to_do)
|
|||
skge_write8(hw, Q_ADDR(rxqaddr[skge->port], Q_CSR), CSR_START);
|
||||
|
||||
if (work_done < to_do) {
|
||||
spin_lock_irq(&hw->hw_lock);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&hw->hw_lock, flags);
|
||||
__netif_rx_complete(dev, napi);
|
||||
hw->intr_mask |= napimask[skge->port];
|
||||
skge_write32(hw, B0_IMSK, hw->intr_mask);
|
||||
skge_read32(hw, B0_IMSK);
|
||||
spin_unlock_irq(&hw->hw_lock);
|
||||
spin_unlock_irqrestore(&hw->hw_lock, flags);
|
||||
}
|
||||
|
||||
return work_done;
|
||||
|
|
|
|||
|
|
@ -4329,10 +4329,14 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
if (!hw)
|
||||
return 0;
|
||||
|
||||
del_timer_sync(&hw->watchdog_timer);
|
||||
cancel_work_sync(&hw->restart_work);
|
||||
|
||||
for (i = 0; i < hw->ports; i++) {
|
||||
struct net_device *dev = hw->dev[i];
|
||||
struct sky2_port *sky2 = netdev_priv(dev);
|
||||
|
||||
netif_device_detach(dev);
|
||||
if (netif_running(dev))
|
||||
sky2_down(dev);
|
||||
|
||||
|
|
@ -4383,6 +4387,8 @@ static int sky2_resume(struct pci_dev *pdev)
|
|||
|
||||
for (i = 0; i < hw->ports; i++) {
|
||||
struct net_device *dev = hw->dev[i];
|
||||
|
||||
netif_device_attach(dev);
|
||||
if (netif_running(dev)) {
|
||||
err = sky2_up(dev);
|
||||
if (err) {
|
||||
|
|
|
|||
|
|
@ -1472,13 +1472,12 @@ static int __netdev_rx(struct net_device *dev, int *quota)
|
|||
#ifndef final_version /* Remove after testing. */
|
||||
/* You will want this info for the initial debug. */
|
||||
if (debug > 5) {
|
||||
DECLARE_MAC_BUF(mac);
|
||||
DECLARE_MAC_BUF(mac2);
|
||||
|
||||
printk(KERN_DEBUG " Rx data %s %s"
|
||||
printk(KERN_DEBUG " Rx data " MAC_FMT " " MAC_FMT
|
||||
" %2.2x%2.2x.\n",
|
||||
print_mac(mac, &skb->data[0]),
|
||||
print_mac(mac2, &skb->data[6]),
|
||||
skb->data[0], skb->data[1], skb->data[2],
|
||||
skb->data[3], skb->data[4], skb->data[5],
|
||||
skb->data[6], skb->data[7], skb->data[8],
|
||||
skb->data[9], skb->data[10], skb->data[11],
|
||||
skb->data[12], skb->data[13]);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -64,8 +64,8 @@
|
|||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.88"
|
||||
#define DRV_MODULE_RELDATE "March 20, 2008"
|
||||
#define DRV_MODULE_VERSION "3.89"
|
||||
#define DRV_MODULE_RELDATE "April 03, 2008"
|
||||
|
||||
#define TG3_DEF_MAC_MODE 0
|
||||
#define TG3_DEF_RX_MODE 0
|
||||
|
|
@ -804,6 +804,12 @@ static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val)
|
||||
{
|
||||
tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg);
|
||||
tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val);
|
||||
}
|
||||
|
||||
static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable)
|
||||
{
|
||||
u32 phy;
|
||||
|
|
@ -886,6 +892,49 @@ static int tg3_bmcr_reset(struct tg3 *tp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void tg3_phy_apply_otp(struct tg3 *tp)
|
||||
{
|
||||
u32 otp, phy;
|
||||
|
||||
if (!tp->phy_otp)
|
||||
return;
|
||||
|
||||
otp = tp->phy_otp;
|
||||
|
||||
/* Enable SM_DSP clock and tx 6dB coding. */
|
||||
phy = MII_TG3_AUXCTL_SHDWSEL_AUXCTL |
|
||||
MII_TG3_AUXCTL_ACTL_SMDSP_ENA |
|
||||
MII_TG3_AUXCTL_ACTL_TX_6DB;
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT);
|
||||
phy |= MII_TG3_DSP_TAP1_AGCTGT_DFLT;
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_TAP1, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_HPFFLTR_MASK) >> TG3_OTP_HPFFLTR_SHIFT) |
|
||||
((otp & TG3_OTP_HPFOVER_MASK) >> TG3_OTP_HPFOVER_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH0, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_LPFDIS_MASK) >> TG3_OTP_LPFDIS_SHIFT);
|
||||
phy |= MII_TG3_DSP_AADJ1CH3_ADCCKADJ;
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH3, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_VDAC_MASK) >> TG3_OTP_VDAC_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_10BTAMP_MASK) >> TG3_OTP_10BTAMP_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP96, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_ROFF_MASK) >> TG3_OTP_ROFF_SHIFT) |
|
||||
((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy);
|
||||
|
||||
/* Turn off SM_DSP clock. */
|
||||
phy = MII_TG3_AUXCTL_SHDWSEL_AUXCTL |
|
||||
MII_TG3_AUXCTL_ACTL_TX_6DB;
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, phy);
|
||||
}
|
||||
|
||||
static int tg3_wait_macro_done(struct tg3 *tp)
|
||||
{
|
||||
int limit = 100;
|
||||
|
|
@ -1073,6 +1122,7 @@ static void tg3_link_report(struct tg3 *);
|
|||
*/
|
||||
static int tg3_phy_reset(struct tg3 *tp)
|
||||
{
|
||||
u32 cpmuctrl;
|
||||
u32 phy_status;
|
||||
int err;
|
||||
|
||||
|
|
@ -1102,10 +1152,28 @@ static int tg3_phy_reset(struct tg3 *tp)
|
|||
goto out;
|
||||
}
|
||||
|
||||
cpmuctrl = 0;
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
|
||||
cpmuctrl = tr32(TG3_CPMU_CTRL);
|
||||
if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY)
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~CPMU_CTRL_GPHY_10MB_RXONLY);
|
||||
}
|
||||
|
||||
err = tg3_bmcr_reset(tp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) {
|
||||
u32 phy;
|
||||
|
||||
phy = MII_TG3_DSP_EXP8_AEDW | MII_TG3_DSP_EXP8_REJ2MHz;
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP8, phy);
|
||||
|
||||
tw32(TG3_CPMU_CTRL, cpmuctrl);
|
||||
}
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
|
||||
u32 val;
|
||||
|
||||
|
|
@ -1124,6 +1192,8 @@ static int tg3_phy_reset(struct tg3 *tp)
|
|||
MII_TG3_MISC_SHDW_APD_WKTM_84MS);
|
||||
}
|
||||
|
||||
tg3_phy_apply_otp(tp);
|
||||
|
||||
out:
|
||||
if (tp->tg3_flags2 & TG3_FLG2_PHY_ADC_BUG) {
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
|
||||
|
|
@ -9464,7 +9534,8 @@ static int tg3_test_loopback(struct tg3 *tp)
|
|||
if (err)
|
||||
return TG3_LOOPBACK_FAILED;
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
|
||||
int i;
|
||||
u32 status;
|
||||
|
||||
|
|
@ -9481,17 +9552,23 @@ static int tg3_test_loopback(struct tg3 *tp)
|
|||
if (status != CPMU_MUTEX_GNT_DRIVER)
|
||||
return TG3_LOOPBACK_FAILED;
|
||||
|
||||
/* Turn off power management based on link speed. */
|
||||
/* Turn off link-based power management. */
|
||||
cpmuctrl = tr32(TG3_CPMU_CTRL);
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~(CPMU_CTRL_LINK_SPEED_MODE |
|
||||
CPMU_CTRL_LINK_AWARE_MODE));
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX)
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~(CPMU_CTRL_LINK_SPEED_MODE |
|
||||
CPMU_CTRL_LINK_AWARE_MODE));
|
||||
else
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~CPMU_CTRL_LINK_AWARE_MODE);
|
||||
}
|
||||
|
||||
if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
|
||||
err |= TG3_MAC_LOOPBACK_FAILED;
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
|
||||
tw32(TG3_CPMU_CTRL, cpmuctrl);
|
||||
|
||||
/* Release the mutex */
|
||||
|
|
@ -10724,9 +10801,8 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
|||
tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
|
||||
tp->led_ctrl = LED_CTRL_MODE_PHY_2;
|
||||
|
||||
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
|
||||
tp->pci_chip_rev_id == CHIPREV_ID_5784_A1)
|
||||
tp->led_ctrl = LED_CTRL_MODE_MAC;
|
||||
if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX)
|
||||
tp->led_ctrl = LED_CTRL_MODE_PHY_1;
|
||||
|
||||
if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) {
|
||||
tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
|
||||
|
|
@ -10773,6 +10849,55 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
|||
}
|
||||
}
|
||||
|
||||
static int __devinit tg3_issue_otp_command(struct tg3 *tp, u32 cmd)
|
||||
{
|
||||
int i;
|
||||
u32 val;
|
||||
|
||||
tw32(OTP_CTRL, cmd | OTP_CTRL_OTP_CMD_START);
|
||||
tw32(OTP_CTRL, cmd);
|
||||
|
||||
/* Wait for up to 1 ms for command to execute. */
|
||||
for (i = 0; i < 100; i++) {
|
||||
val = tr32(OTP_STATUS);
|
||||
if (val & OTP_STATUS_CMD_DONE)
|
||||
break;
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
return (val & OTP_STATUS_CMD_DONE) ? 0 : -EBUSY;
|
||||
}
|
||||
|
||||
/* Read the gphy configuration from the OTP region of the chip. The gphy
|
||||
* configuration is a 32-bit value that straddles the alignment boundary.
|
||||
* We do two 32-bit reads and then shift and merge the results.
|
||||
*/
|
||||
static u32 __devinit tg3_read_otp_phycfg(struct tg3 *tp)
|
||||
{
|
||||
u32 bhalf_otp, thalf_otp;
|
||||
|
||||
tw32(OTP_MODE, OTP_MODE_OTP_THRU_GRC);
|
||||
|
||||
if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_INIT))
|
||||
return 0;
|
||||
|
||||
tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC1);
|
||||
|
||||
if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
|
||||
return 0;
|
||||
|
||||
thalf_otp = tr32(OTP_READ_DATA);
|
||||
|
||||
tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC2);
|
||||
|
||||
if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
|
||||
return 0;
|
||||
|
||||
bhalf_otp = tr32(OTP_READ_DATA);
|
||||
|
||||
return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16);
|
||||
}
|
||||
|
||||
static int __devinit tg3_phy_probe(struct tg3 *tp)
|
||||
{
|
||||
u32 hw_phy_id_1, hw_phy_id_2;
|
||||
|
|
@ -11586,6 +11711,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
|||
tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
|
||||
}
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
|
||||
tp->phy_otp = tg3_read_otp_phycfg(tp);
|
||||
if (tp->phy_otp == 0)
|
||||
tp->phy_otp = TG3_OTP_DEFAULT;
|
||||
}
|
||||
|
||||
tp->coalesce_mode = 0;
|
||||
if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX)
|
||||
|
|
|
|||
|
|
@ -138,6 +138,8 @@
|
|||
#define CHIPREV_5704_BX 0x21
|
||||
#define CHIPREV_5750_AX 0x40
|
||||
#define CHIPREV_5750_BX 0x41
|
||||
#define CHIPREV_5784_AX 0x57840
|
||||
#define CHIPREV_5761_AX 0x57610
|
||||
#define GET_METAL_REV(CHIP_REV_ID) ((CHIP_REV_ID) & 0xff)
|
||||
#define METAL_REV_A0 0x00
|
||||
#define METAL_REV_A1 0x01
|
||||
|
|
@ -866,6 +868,7 @@
|
|||
#define CPMU_CTRL_LINK_IDLE_MODE 0x00000200
|
||||
#define CPMU_CTRL_LINK_AWARE_MODE 0x00000400
|
||||
#define CPMU_CTRL_LINK_SPEED_MODE 0x00004000
|
||||
#define CPMU_CTRL_GPHY_10MB_RXONLY 0x00010000
|
||||
#define TG3_CPMU_LSPD_10MB_CLK 0x00003604
|
||||
#define CPMU_LSPD_10MB_MACCLK_MASK 0x001f0000
|
||||
#define CPMU_LSPD_10MB_MACCLK_6_25 0x00130000
|
||||
|
|
@ -1559,7 +1562,24 @@
|
|||
/* 0x702c unused */
|
||||
|
||||
#define NVRAM_ADDR_LOCKOUT 0x00007030
|
||||
/* 0x7034 --> 0x7c00 unused */
|
||||
/* 0x7034 --> 0x7500 unused */
|
||||
|
||||
#define OTP_MODE 0x00007500
|
||||
#define OTP_MODE_OTP_THRU_GRC 0x00000001
|
||||
#define OTP_CTRL 0x00007504
|
||||
#define OTP_CTRL_OTP_PROG_ENABLE 0x00200000
|
||||
#define OTP_CTRL_OTP_CMD_READ 0x00000000
|
||||
#define OTP_CTRL_OTP_CMD_INIT 0x00000008
|
||||
#define OTP_CTRL_OTP_CMD_START 0x00000001
|
||||
#define OTP_STATUS 0x00007508
|
||||
#define OTP_STATUS_CMD_DONE 0x00000001
|
||||
#define OTP_ADDRESS 0x0000750c
|
||||
#define OTP_ADDRESS_MAGIC1 0x000000a0
|
||||
#define OTP_ADDRESS_MAGIC2 0x00000080
|
||||
/* 0x7510 unused */
|
||||
|
||||
#define OTP_READ_DATA 0x00007514
|
||||
/* 0x7518 --> 0x7c04 unused */
|
||||
|
||||
#define PCIE_TRANSACTION_CFG 0x00007c04
|
||||
#define PCIE_TRANS_CFG_1SHOT_MSI 0x20000000
|
||||
|
|
@ -1568,6 +1588,28 @@
|
|||
#define PCIE_PWR_MGMT_THRESH 0x00007d28
|
||||
#define PCIE_PWR_MGMT_L1_THRESH_MSK 0x0000ff00
|
||||
|
||||
|
||||
/* OTP bit definitions */
|
||||
#define TG3_OTP_AGCTGT_MASK 0x000000e0
|
||||
#define TG3_OTP_AGCTGT_SHIFT 1
|
||||
#define TG3_OTP_HPFFLTR_MASK 0x00000300
|
||||
#define TG3_OTP_HPFFLTR_SHIFT 1
|
||||
#define TG3_OTP_HPFOVER_MASK 0x00000400
|
||||
#define TG3_OTP_HPFOVER_SHIFT 1
|
||||
#define TG3_OTP_LPFDIS_MASK 0x00000800
|
||||
#define TG3_OTP_LPFDIS_SHIFT 11
|
||||
#define TG3_OTP_VDAC_MASK 0xff000000
|
||||
#define TG3_OTP_VDAC_SHIFT 24
|
||||
#define TG3_OTP_10BTAMP_MASK 0x0000f000
|
||||
#define TG3_OTP_10BTAMP_SHIFT 8
|
||||
#define TG3_OTP_ROFF_MASK 0x00e00000
|
||||
#define TG3_OTP_ROFF_SHIFT 11
|
||||
#define TG3_OTP_RCOFF_MASK 0x001c0000
|
||||
#define TG3_OTP_RCOFF_SHIFT 16
|
||||
|
||||
#define TG3_OTP_DEFAULT 0x286c1640
|
||||
|
||||
|
||||
#define TG3_EEPROM_MAGIC 0x669955aa
|
||||
#define TG3_EEPROM_MAGIC_FW 0xa5000000
|
||||
#define TG3_EEPROM_MAGIC_FW_MSK 0xff000000
|
||||
|
|
@ -1705,15 +1747,31 @@
|
|||
|
||||
#define MII_TG3_DSP_RW_PORT 0x15 /* DSP coefficient read/write port */
|
||||
|
||||
#define MII_TG3_DSP_ADDRESS 0x17 /* DSP address register */
|
||||
#define MII_TG3_EPHY_PTEST 0x17 /* 5906 PHY register */
|
||||
#define MII_TG3_DSP_ADDRESS 0x17 /* DSP address register */
|
||||
|
||||
#define MII_TG3_DSP_TAP1 0x0001
|
||||
#define MII_TG3_DSP_TAP1_AGCTGT_DFLT 0x0007
|
||||
#define MII_TG3_DSP_AADJ1CH0 0x001f
|
||||
#define MII_TG3_DSP_AADJ1CH3 0x601f
|
||||
#define MII_TG3_DSP_AADJ1CH3_ADCCKADJ 0x0002
|
||||
#define MII_TG3_DSP_EXP8 0x0708
|
||||
#define MII_TG3_DSP_EXP8_REJ2MHz 0x0001
|
||||
#define MII_TG3_DSP_EXP8_AEDW 0x0200
|
||||
#define MII_TG3_DSP_EXP75 0x0f75
|
||||
#define MII_TG3_DSP_EXP96 0x0f96
|
||||
#define MII_TG3_DSP_EXP97 0x0f97
|
||||
|
||||
#define MII_TG3_AUX_CTRL 0x18 /* auxilliary control register */
|
||||
|
||||
#define MII_TG3_AUXCTL_MISC_WREN 0x8000
|
||||
#define MII_TG3_AUXCTL_MISC_FORCE_AMDIX 0x0200
|
||||
#define MII_TG3_AUXCTL_MISC_RDSEL_MISC 0x7000
|
||||
#define MII_TG3_AUXCTL_SHDWSEL_MISC 0x0007
|
||||
#define MII_TG3_AUXCTL_SHDWSEL_MISC 0x0007
|
||||
|
||||
#define MII_TG3_AUXCTL_ACTL_SMDSP_ENA 0x0800
|
||||
#define MII_TG3_AUXCTL_ACTL_TX_6DB 0x0400
|
||||
#define MII_TG3_AUXCTL_SHDWSEL_AUXCTL 0x0000
|
||||
|
||||
#define MII_TG3_AUX_STAT 0x19 /* auxilliary status register */
|
||||
#define MII_TG3_AUX_STAT_LPASS 0x0004
|
||||
|
|
@ -1743,6 +1801,20 @@
|
|||
#define MII_TG3_INT_DUPLEXCHG 0x0008
|
||||
#define MII_TG3_INT_ANEG_PAGE_RX 0x0400
|
||||
|
||||
#define MII_TG3_MISC_SHDW 0x1c
|
||||
#define MII_TG3_MISC_SHDW_WREN 0x8000
|
||||
#define MII_TG3_MISC_SHDW_SCR5_SEL 0x1400
|
||||
#define MII_TG3_MISC_SHDW_APD_SEL 0x2800
|
||||
|
||||
#define MII_TG3_MISC_SHDW_SCR5_C125OE 0x0001
|
||||
#define MII_TG3_MISC_SHDW_SCR5_DLLAPD 0x0002
|
||||
#define MII_TG3_MISC_SHDW_SCR5_SDTL 0x0004
|
||||
#define MII_TG3_MISC_SHDW_SCR5_DLPTLM 0x0008
|
||||
#define MII_TG3_MISC_SHDW_SCR5_LPED 0x0010
|
||||
|
||||
#define MII_TG3_MISC_SHDW_APD_WKTM_84MS 0x0001
|
||||
#define MII_TG3_MISC_SHDW_APD_ENABLE 0x0020
|
||||
|
||||
#define MII_TG3_EPHY_TEST 0x1f /* 5906 PHY register */
|
||||
#define MII_TG3_EPHY_SHADOW_EN 0x80
|
||||
|
||||
|
|
@ -2473,6 +2545,7 @@ struct tg3 {
|
|||
#define PHY_REV_BCM5411_X0 0x1 /* Found on Netgear GA302T */
|
||||
|
||||
u32 led_ctrl;
|
||||
u32 phy_otp;
|
||||
u16 pci_cmd;
|
||||
|
||||
char board_part_number[24];
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@
|
|||
* Official releases will only have an a.b.c version number format.
|
||||
*/
|
||||
|
||||
static char version[] __devinitdata =
|
||||
static char version[] =
|
||||
"Olympic.c v1.0.5 6/04/02 - Peter De Schrijver & Mike Phillips" ;
|
||||
|
||||
static char *open_maj_error[] = {"No error", "Lobe Media Test", "Physical Insertion",
|
||||
|
|
@ -290,7 +290,7 @@ op_disable_dev:
|
|||
return i;
|
||||
}
|
||||
|
||||
static int __devinit olympic_init(struct net_device *dev)
|
||||
static int olympic_init(struct net_device *dev)
|
||||
{
|
||||
struct olympic_private *olympic_priv;
|
||||
u8 __iomem *olympic_mmio, *init_srb,*adapter_addr;
|
||||
|
|
@ -434,7 +434,7 @@ static int __devinit olympic_init(struct net_device *dev)
|
|||
|
||||
}
|
||||
|
||||
static int __devinit olympic_open(struct net_device *dev)
|
||||
static int olympic_open(struct net_device *dev)
|
||||
{
|
||||
struct olympic_private *olympic_priv=netdev_priv(dev);
|
||||
u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio,*init_srb;
|
||||
|
|
@ -1438,13 +1438,18 @@ static void olympic_arb_cmd(struct net_device *dev)
|
|||
|
||||
if (olympic_priv->olympic_network_monitor) {
|
||||
struct trh_hdr *mac_hdr;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
printk(KERN_WARNING "%s: Received MAC Frame, details: \n",dev->name);
|
||||
mac_hdr = tr_hdr(mac_frame);
|
||||
printk(KERN_WARNING "%s: MAC Frame Dest. Addr: %s\n",
|
||||
dev->name, print_mac(mac, mac_hdr->daddr));
|
||||
printk(KERN_WARNING "%s: MAC Frame Srce. Addr: %s\n",
|
||||
dev->name, print_mac(mac, mac_hdr->saddr));
|
||||
printk(KERN_WARNING "%s: MAC Frame Dest. Addr: "
|
||||
MAC_FMT " \n", dev->name,
|
||||
mac_hdr->daddr[0], mac_hdr->daddr[1],
|
||||
mac_hdr->daddr[2], mac_hdr->daddr[3],
|
||||
mac_hdr->daddr[4], mac_hdr->daddr[5]);
|
||||
printk(KERN_WARNING "%s: MAC Frame Srce. Addr: "
|
||||
MAC_FMT " \n", dev->name,
|
||||
mac_hdr->saddr[0], mac_hdr->saddr[1],
|
||||
mac_hdr->saddr[2], mac_hdr->saddr[3],
|
||||
mac_hdr->saddr[4], mac_hdr->saddr[5]);
|
||||
}
|
||||
netif_rx(mac_frame);
|
||||
dev->last_rx = jiffies;
|
||||
|
|
|
|||
|
|
@ -3413,7 +3413,7 @@ static int smctr_make_tx_status_code(struct net_device *dev,
|
|||
tsv->svi = TRANSMIT_STATUS_CODE;
|
||||
tsv->svl = S_TRANSMIT_STATUS_CODE;
|
||||
|
||||
tsv->svv[0] = ((tx_fstatus & 0x0100 >> 6) || IBM_PASS_SOURCE_ADDR);
|
||||
tsv->svv[0] = ((tx_fstatus & 0x0100 >> 6) | IBM_PASS_SOURCE_ADDR);
|
||||
|
||||
/* Stripped frame status of Transmitted Frame */
|
||||
tsv->svv[1] = tx_fstatus & 0xff;
|
||||
|
|
|
|||
|
|
@ -343,6 +343,12 @@ int __devinit tulip_read_eeprom(struct net_device *dev, int location, int addr_l
|
|||
void __iomem *ee_addr = tp->base_addr + CSR9;
|
||||
int read_cmd = location | (EE_READ_CMD << addr_len);
|
||||
|
||||
/* If location is past the end of what we can address, don't
|
||||
* read some other location (ie truncate). Just return zero.
|
||||
*/
|
||||
if (location > (1 << addr_len) - 1)
|
||||
return 0;
|
||||
|
||||
iowrite32(EE_ENB & ~EE_CS, ee_addr);
|
||||
iowrite32(EE_ENB, ee_addr);
|
||||
|
||||
|
|
|
|||
|
|
@ -1437,6 +1437,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
|
|||
EEPROM.
|
||||
*/
|
||||
ee_data = tp->eeprom;
|
||||
memset(ee_data, 0, sizeof(tp->eeprom));
|
||||
sum = 0;
|
||||
if (chip_idx == LC82C168) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
|
|
@ -1458,8 +1459,12 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
|
|||
/* A serial EEPROM interface, we read now and sort it out later. */
|
||||
int sa_offset = 0;
|
||||
int ee_addr_size = tulip_read_eeprom(dev, 0xff, 8) & 0x40000 ? 8 : 6;
|
||||
int ee_max_addr = ((1 << ee_addr_size) - 1) * sizeof(u16);
|
||||
|
||||
for (i = 0; i < sizeof(tp->eeprom); i+=2) {
|
||||
if (ee_max_addr > sizeof(tp->eeprom))
|
||||
ee_max_addr = sizeof(tp->eeprom);
|
||||
|
||||
for (i = 0; i < ee_max_addr ; i += sizeof(u16)) {
|
||||
u16 data = tulip_read_eeprom(dev, i/2, ee_addr_size);
|
||||
ee_data[i] = data & 0xff;
|
||||
ee_data[i + 1] = data >> 8;
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ config USB_USBNET
|
|||
|
||||
config USB_NET_AX8817X
|
||||
tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters"
|
||||
depends on USB_USBNET && NET_ETHERNET
|
||||
depends on USB_USBNET
|
||||
select CRC32
|
||||
default y
|
||||
help
|
||||
|
|
|
|||
|
|
@ -341,7 +341,7 @@ static void dm9601_set_multicast(struct net_device *net)
|
|||
/* We use the 20 byte dev->data for our 8 byte filter buffer
|
||||
* to avoid allocating memory that is tricky to free later */
|
||||
u8 *hashes = (u8 *) & dev->data;
|
||||
u8 rx_ctl = 0x01;
|
||||
u8 rx_ctl = 0x31;
|
||||
|
||||
memset(hashes, 0x00, DM_MCAST_SIZE);
|
||||
hashes[DM_MCAST_SIZE - 1] |= 0x80; /* broadcast address */
|
||||
|
|
@ -354,7 +354,7 @@ static void dm9601_set_multicast(struct net_device *net)
|
|||
struct dev_mc_list *mc_list = net->mc_list;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < net->mc_count; i++) {
|
||||
for (i = 0; i < net->mc_count; i++, mc_list = mc_list->next) {
|
||||
u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26;
|
||||
hashes[crc >> 3] |= 1 << (crc & 0x7);
|
||||
}
|
||||
|
|
@ -562,6 +562,10 @@ static const struct usb_device_id products[] = {
|
|||
USB_DEVICE(0x0a46, 0x8515), /* ADMtek ADM8515 USB NIC */
|
||||
.driver_info = (unsigned long)&dm9601_info,
|
||||
},
|
||||
{
|
||||
USB_DEVICE(0x0a47, 0x9601), /* Hirose USB-100 */
|
||||
.driver_info = (unsigned long)&dm9601_info,
|
||||
},
|
||||
{}, // END
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1128,12 +1128,8 @@ pegasus_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
|||
{
|
||||
pegasus_t *pegasus;
|
||||
|
||||
if (in_atomic())
|
||||
return 0;
|
||||
|
||||
pegasus = netdev_priv(dev);
|
||||
mii_ethtool_gset(&pegasus->mii, ecmd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -283,7 +283,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
|
|||
struct rndis_set_c *set_c;
|
||||
struct rndis_halt *halt;
|
||||
} u;
|
||||
u32 tmp, *phym;
|
||||
u32 tmp, phym_unspec, *phym;
|
||||
int reply_len;
|
||||
unsigned char *bp;
|
||||
|
||||
|
|
@ -363,12 +363,15 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
|
|||
goto halt_fail_and_release;
|
||||
|
||||
/* Check physical medium */
|
||||
phym = NULL;
|
||||
reply_len = sizeof *phym;
|
||||
retval = rndis_query(dev, intf, u.buf, OID_GEN_PHYSICAL_MEDIUM,
|
||||
0, (void **) &phym, &reply_len);
|
||||
if (retval != 0)
|
||||
if (retval != 0 || !phym) {
|
||||
/* OID is optional so don't fail here. */
|
||||
*phym = RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED;
|
||||
phym_unspec = RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED;
|
||||
phym = &phym_unspec;
|
||||
}
|
||||
if ((flags & FLAG_RNDIS_PHYM_WIRELESS) &&
|
||||
*phym != RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN) {
|
||||
if (netif_msg_probe(dev))
|
||||
|
|
|
|||
|
|
@ -234,11 +234,12 @@ static int start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct scatterlist sg[1+MAX_SKB_FRAGS];
|
||||
struct virtio_net_hdr *hdr;
|
||||
const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
sg_init_table(sg, 1+MAX_SKB_FRAGS);
|
||||
|
||||
pr_debug("%s: xmit %p %s\n", dev->name, skb, print_mac(mac, dest));
|
||||
pr_debug("%s: xmit %p " MAC_FMT "\n", dev->name, skb,
|
||||
dest[0], dest[1], dest[2],
|
||||
dest[3], dest[4], dest[5]);
|
||||
|
||||
/* Encode metadata header at front. */
|
||||
hdr = skb_vnet_hdr(skb);
|
||||
|
|
@ -284,7 +285,6 @@ again:
|
|||
/* Activate callback for using skbs: if this returns false it
|
||||
* means some were used in the meantime. */
|
||||
if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) {
|
||||
printk("Unlikely: restart svq race\n");
|
||||
vi->svq->vq_ops->disable_cb(vi->svq);
|
||||
netif_start_queue(dev);
|
||||
goto again;
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ struct lapbethdev {
|
|||
struct net_device_stats stats; /* some statistics */
|
||||
};
|
||||
|
||||
static struct list_head lapbeth_devices = LIST_HEAD_INIT(lapbeth_devices);
|
||||
static LIST_HEAD(lapbeth_devices);
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
|
|
|
|||
|
|
@ -1197,13 +1197,6 @@ static ctl_table arlan_table[] =
|
|||
|
||||
#else
|
||||
|
||||
static ctl_table arlan_table[MAX_ARLANS + 1] =
|
||||
{
|
||||
{ .ctl_name = 0 }
|
||||
};
|
||||
#endif
|
||||
#else
|
||||
|
||||
static ctl_table arlan_table[MAX_ARLANS + 1] =
|
||||
{
|
||||
{ .ctl_name = 0 }
|
||||
|
|
@ -1233,7 +1226,6 @@ static ctl_table arlan_root_table[] =
|
|||
//};
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static struct ctl_table_header *arlan_device_sysctl_header;
|
||||
|
||||
int __init init_arlan_proc(void)
|
||||
|
|
|
|||
|
|
@ -618,6 +618,7 @@ void b43_debugfs_remove_device(struct b43_wldev *dev)
|
|||
kfree(e);
|
||||
}
|
||||
|
||||
/* Called with IRQs disabled. */
|
||||
void b43_debugfs_log_txstat(struct b43_wldev *dev,
|
||||
const struct b43_txstatus *status)
|
||||
{
|
||||
|
|
@ -629,8 +630,7 @@ void b43_debugfs_log_txstat(struct b43_wldev *dev,
|
|||
if (!e)
|
||||
return;
|
||||
log = &e->txstatlog;
|
||||
B43_WARN_ON(!irqs_disabled());
|
||||
spin_lock(&log->lock);
|
||||
spin_lock(&log->lock); /* IRQs are already disabled. */
|
||||
i = log->end + 1;
|
||||
if (i == B43_NR_LOGGED_TXSTATUS)
|
||||
i = 0;
|
||||
|
|
|
|||
|
|
@ -560,7 +560,7 @@ static int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base,
|
|||
/* Check if a DMA mapping address is invalid. */
|
||||
static bool b43_dma_mapping_error(struct b43_dmaring *ring,
|
||||
dma_addr_t addr,
|
||||
size_t buffersize)
|
||||
size_t buffersize, bool dma_to_device)
|
||||
{
|
||||
if (unlikely(dma_mapping_error(addr)))
|
||||
return 1;
|
||||
|
|
@ -568,11 +568,11 @@ static bool b43_dma_mapping_error(struct b43_dmaring *ring,
|
|||
switch (ring->type) {
|
||||
case B43_DMA_30BIT:
|
||||
if ((u64)addr + buffersize > (1ULL << 30))
|
||||
return 1;
|
||||
goto address_error;
|
||||
break;
|
||||
case B43_DMA_32BIT:
|
||||
if ((u64)addr + buffersize > (1ULL << 32))
|
||||
return 1;
|
||||
goto address_error;
|
||||
break;
|
||||
case B43_DMA_64BIT:
|
||||
/* Currently we can't have addresses beyond
|
||||
|
|
@ -582,6 +582,12 @@ static bool b43_dma_mapping_error(struct b43_dmaring *ring,
|
|||
|
||||
/* The address is OK. */
|
||||
return 0;
|
||||
|
||||
address_error:
|
||||
/* We can't support this address. Unmap it again. */
|
||||
unmap_descbuffer(ring, addr, buffersize, dma_to_device);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
||||
|
|
@ -599,7 +605,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
|||
if (unlikely(!skb))
|
||||
return -ENOMEM;
|
||||
dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0);
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) {
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
|
||||
/* ugh. try to realloc in zone_dma */
|
||||
gfp_flags |= GFP_DMA;
|
||||
|
||||
|
|
@ -612,7 +618,8 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
|||
ring->rx_buffersize, 0);
|
||||
}
|
||||
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) {
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
|
||||
b43err(ring->dev->wl, "RX DMA buffer allocation failed\n");
|
||||
dev_kfree_skb_any(skb);
|
||||
return -EIO;
|
||||
}
|
||||
|
|
@ -852,7 +859,8 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
|||
b43_txhdr_size(dev),
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
if (b43_dma_mapping_error(ring, dma_test, b43_txhdr_size(dev))) {
|
||||
if (b43_dma_mapping_error(ring, dma_test,
|
||||
b43_txhdr_size(dev), 1)) {
|
||||
/* ugh realloc */
|
||||
kfree(ring->txhdr_cache);
|
||||
ring->txhdr_cache = kcalloc(nr_slots,
|
||||
|
|
@ -867,8 +875,12 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
|||
DMA_TO_DEVICE);
|
||||
|
||||
if (b43_dma_mapping_error(ring, dma_test,
|
||||
b43_txhdr_size(dev)))
|
||||
b43_txhdr_size(dev), 1)) {
|
||||
|
||||
b43err(dev->wl,
|
||||
"TXHDR DMA allocation failed\n");
|
||||
goto err_kfree_txhdr_cache;
|
||||
}
|
||||
}
|
||||
|
||||
dma_unmap_single(dev->dev->dev,
|
||||
|
|
@ -1189,7 +1201,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
|||
|
||||
meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
|
||||
hdrsize, 1);
|
||||
if (b43_dma_mapping_error(ring, meta_hdr->dmaaddr, hdrsize)) {
|
||||
if (b43_dma_mapping_error(ring, meta_hdr->dmaaddr, hdrsize, 1)) {
|
||||
ring->current_slot = old_top_slot;
|
||||
ring->used_slots = old_used_slots;
|
||||
return -EIO;
|
||||
|
|
@ -1208,7 +1220,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
|||
|
||||
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
||||
/* create a bounce buffer in zone_dma on mapping failure. */
|
||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len)) {
|
||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
|
||||
bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
|
||||
if (!bounce_skb) {
|
||||
ring->current_slot = old_top_slot;
|
||||
|
|
@ -1222,7 +1234,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
|||
skb = bounce_skb;
|
||||
meta->skb = skb;
|
||||
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len)) {
|
||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
|
||||
ring->current_slot = old_top_slot;
|
||||
ring->used_slots = old_used_slots;
|
||||
err = -EIO;
|
||||
|
|
@ -1337,6 +1349,7 @@ out_unlock:
|
|||
return err;
|
||||
}
|
||||
|
||||
/* Called with IRQs disabled. */
|
||||
void b43_dma_handle_txstatus(struct b43_wldev *dev,
|
||||
const struct b43_txstatus *status)
|
||||
{
|
||||
|
|
@ -1349,8 +1362,8 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev,
|
|||
ring = parse_cookie(dev, status->cookie, &slot);
|
||||
if (unlikely(!ring))
|
||||
return;
|
||||
B43_WARN_ON(!irqs_disabled());
|
||||
spin_lock(&ring->lock);
|
||||
|
||||
spin_lock(&ring->lock); /* IRQs are already disabled. */
|
||||
|
||||
B43_WARN_ON(!ring->tx);
|
||||
ops = ring->ops;
|
||||
|
|
|
|||
|
|
@ -2049,7 +2049,6 @@ void b43_mac_enable(struct b43_wldev *dev)
|
|||
{
|
||||
dev->mac_suspended--;
|
||||
B43_WARN_ON(dev->mac_suspended < 0);
|
||||
B43_WARN_ON(irqs_disabled());
|
||||
if (dev->mac_suspended == 0) {
|
||||
b43_write32(dev, B43_MMIO_MACCTL,
|
||||
b43_read32(dev, B43_MMIO_MACCTL)
|
||||
|
|
@ -2075,7 +2074,6 @@ void b43_mac_suspend(struct b43_wldev *dev)
|
|||
u32 tmp;
|
||||
|
||||
might_sleep();
|
||||
B43_WARN_ON(irqs_disabled());
|
||||
B43_WARN_ON(dev->mac_suspended < 0);
|
||||
|
||||
if (dev->mac_suspended == 0) {
|
||||
|
|
|
|||
|
|
@ -91,6 +91,8 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
|||
|
||||
dev->conf.ConfigBase = parse.config.base;
|
||||
dev->conf.Present = parse.config.rmask[0];
|
||||
dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
dev->io.BasePort2 = 0;
|
||||
dev->io.NumPorts2 = 0;
|
||||
|
|
@ -112,8 +114,8 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
|||
if (res != CS_SUCCESS)
|
||||
goto err_disable;
|
||||
|
||||
dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_FIRST_SHARED;
|
||||
dev->irq.IRQInfo1 = IRQ_LEVEL_ID | IRQ_SHARE_ID;
|
||||
dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
dev->irq.Handler = NULL; /* The handler is registered later. */
|
||||
dev->irq.Instance = NULL;
|
||||
res = pcmcia_request_irq(dev, &dev->irq);
|
||||
|
|
|
|||
|
|
@ -635,7 +635,6 @@ hostap_rx_frame_decrypt(local_info_t *local, struct sk_buff *skb,
|
|||
{
|
||||
struct ieee80211_hdr_4addr *hdr;
|
||||
int res, hdrlen;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
|
||||
return 0;
|
||||
|
|
@ -647,8 +646,10 @@ hostap_rx_frame_decrypt(local_info_t *local, struct sk_buff *skb,
|
|||
strcmp(crypt->ops->name, "TKIP") == 0) {
|
||||
if (net_ratelimit()) {
|
||||
printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
|
||||
"received packet from %s\n",
|
||||
local->dev->name, print_mac(mac, hdr->addr2));
|
||||
"received packet from " MAC_FMT "\n",
|
||||
local->dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5]);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -657,9 +658,12 @@ hostap_rx_frame_decrypt(local_info_t *local, struct sk_buff *skb,
|
|||
res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv);
|
||||
atomic_dec(&crypt->refcnt);
|
||||
if (res < 0) {
|
||||
printk(KERN_DEBUG "%s: decryption failed (SA=%s"
|
||||
printk(KERN_DEBUG "%s: decryption failed (SA=" MAC_FMT
|
||||
") res=%d\n",
|
||||
local->dev->name, print_mac(mac, hdr->addr2), res);
|
||||
local->dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
res);
|
||||
local->comm_tallies.rx_discards_wep_undecryptable++;
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -721,7 +725,6 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
|
|||
struct ieee80211_crypt_data *crypt = NULL;
|
||||
void *sta = NULL;
|
||||
int keyidx = 0;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
iface = netdev_priv(dev);
|
||||
local = iface->local;
|
||||
|
|
@ -798,8 +801,10 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
|
|||
* frames silently instead of filling system log with
|
||||
* these reports. */
|
||||
printk(KERN_DEBUG "%s: WEP decryption failed (not set)"
|
||||
" (SA=%s)\n",
|
||||
local->dev->name, print_mac(mac, hdr->addr2));
|
||||
" (SA=" MAC_FMT ")\n",
|
||||
local->dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5]);
|
||||
#endif
|
||||
local->comm_tallies.rx_discards_wep_undecryptable++;
|
||||
goto rx_dropped;
|
||||
|
|
@ -813,8 +818,9 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
|
|||
(keyidx = hostap_rx_frame_decrypt(local, skb, crypt)) < 0)
|
||||
{
|
||||
printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth "
|
||||
"from %s\n", dev->name,
|
||||
print_mac(mac, hdr->addr2));
|
||||
"from " MAC_FMT "\n", dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5]);
|
||||
/* TODO: could inform hostapd about this so that it
|
||||
* could send auth failure report */
|
||||
goto rx_dropped;
|
||||
|
|
@ -982,8 +988,10 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
|
|||
"unencrypted EAPOL frame\n", local->dev->name);
|
||||
} else {
|
||||
printk(KERN_DEBUG "%s: encryption configured, but RX "
|
||||
"frame not encrypted (SA=%s)\n",
|
||||
local->dev->name, print_mac(mac, hdr->addr2));
|
||||
"frame not encrypted (SA=" MAC_FMT ")\n",
|
||||
local->dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5]);
|
||||
goto rx_dropped;
|
||||
}
|
||||
}
|
||||
|
|
@ -992,9 +1000,10 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
|
|||
!hostap_is_eapol_frame(local, skb)) {
|
||||
if (net_ratelimit()) {
|
||||
printk(KERN_DEBUG "%s: dropped unencrypted RX data "
|
||||
"frame from %s"
|
||||
" (drop_unencrypted=1)\n",
|
||||
dev->name, print_mac(mac, hdr->addr2));
|
||||
"frame from " MAC_FMT " (drop_unencrypted=1)\n",
|
||||
dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5]);
|
||||
}
|
||||
goto rx_dropped;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -314,7 +314,6 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb,
|
|||
struct ieee80211_hdr_4addr *hdr;
|
||||
u16 fc;
|
||||
int prefix_len, postfix_len, hdr_len, res;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
iface = netdev_priv(skb->dev);
|
||||
local = iface->local;
|
||||
|
|
@ -329,8 +328,10 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb,
|
|||
hdr = (struct ieee80211_hdr_4addr *) skb->data;
|
||||
if (net_ratelimit()) {
|
||||
printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
|
||||
"TX packet to %s\n",
|
||||
local->dev->name, print_mac(mac, hdr->addr1));
|
||||
"TX packet to " MAC_FMT "\n",
|
||||
local->dev->name,
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5]);
|
||||
}
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -632,7 +632,6 @@ static void hostap_ap_tx_cb_auth(struct sk_buff *skb, int ok, void *data)
|
|||
__le16 *pos;
|
||||
struct sta_info *sta = NULL;
|
||||
char *txt = NULL;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
if (ap->local->hostapd) {
|
||||
dev_kfree_skb(skb);
|
||||
|
|
@ -684,10 +683,12 @@ static void hostap_ap_tx_cb_auth(struct sk_buff *skb, int ok, void *data)
|
|||
if (sta)
|
||||
atomic_dec(&sta->users);
|
||||
if (txt) {
|
||||
PDEBUG(DEBUG_AP, "%s: %s auth_cb - alg=%d "
|
||||
PDEBUG(DEBUG_AP, "%s: " MAC_FMT " auth_cb - alg=%d "
|
||||
"trans#=%d status=%d - %s\n",
|
||||
dev->name, print_mac(mac, hdr->addr1), auth_alg,
|
||||
auth_transaction, status, txt);
|
||||
dev->name,
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5],
|
||||
auth_alg, auth_transaction, status, txt);
|
||||
}
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
|
@ -703,7 +704,6 @@ static void hostap_ap_tx_cb_assoc(struct sk_buff *skb, int ok, void *data)
|
|||
__le16 *pos;
|
||||
struct sta_info *sta = NULL;
|
||||
char *txt = NULL;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
if (ap->local->hostapd) {
|
||||
dev_kfree_skb(skb);
|
||||
|
|
@ -754,8 +754,11 @@ static void hostap_ap_tx_cb_assoc(struct sk_buff *skb, int ok, void *data)
|
|||
if (sta)
|
||||
atomic_dec(&sta->users);
|
||||
if (txt) {
|
||||
PDEBUG(DEBUG_AP, "%s: %s assoc_cb - %s\n",
|
||||
dev->name, print_mac(mac, hdr->addr1), txt);
|
||||
PDEBUG(DEBUG_AP, "%s: " MAC_FMT " assoc_cb - %s\n",
|
||||
dev->name,
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5],
|
||||
txt);
|
||||
}
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
|
@ -767,7 +770,6 @@ static void hostap_ap_tx_cb_poll(struct sk_buff *skb, int ok, void *data)
|
|||
struct ap_data *ap = data;
|
||||
struct ieee80211_hdr_4addr *hdr;
|
||||
struct sta_info *sta;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
if (skb->len < 24)
|
||||
goto fail;
|
||||
|
|
@ -779,9 +781,11 @@ static void hostap_ap_tx_cb_poll(struct sk_buff *skb, int ok, void *data)
|
|||
sta->flags &= ~WLAN_STA_PENDING_POLL;
|
||||
spin_unlock(&ap->sta_table_lock);
|
||||
} else {
|
||||
PDEBUG(DEBUG_AP, "%s: STA %s"
|
||||
PDEBUG(DEBUG_AP, "%s: STA " MAC_FMT
|
||||
" did not ACK activity poll frame\n",
|
||||
ap->local->dev->name, print_mac(mac, hdr->addr1));
|
||||
ap->local->dev->name,
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5]);
|
||||
}
|
||||
|
||||
fail:
|
||||
|
|
@ -1306,7 +1310,6 @@ static void handle_authen(local_info_t *local, struct sk_buff *skb,
|
|||
struct sta_info *sta = NULL;
|
||||
struct ieee80211_crypt_data *crypt;
|
||||
char *txt = "";
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
len = skb->len - IEEE80211_MGMT_HDR_LEN;
|
||||
|
||||
|
|
@ -1315,8 +1318,9 @@ static void handle_authen(local_info_t *local, struct sk_buff *skb,
|
|||
|
||||
if (len < 6) {
|
||||
PDEBUG(DEBUG_AP, "%s: handle_authen - too short payload "
|
||||
"(len=%d) from %s\n", dev->name, len,
|
||||
print_mac(mac, hdr->addr2));
|
||||
"(len=%d) from " MAC_FMT "\n", dev->name, len,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1381,8 +1385,10 @@ static void handle_authen(local_info_t *local, struct sk_buff *skb,
|
|||
if (time_after(jiffies, sta->u.ap.last_beacon +
|
||||
(10 * sta->listen_interval * HZ) / 1024)) {
|
||||
PDEBUG(DEBUG_AP, "%s: no beacons received for a while,"
|
||||
" assuming AP %s is now STA\n",
|
||||
dev->name, print_mac(mac, sta->addr));
|
||||
" assuming AP " MAC_FMT " is now STA\n",
|
||||
dev->name,
|
||||
sta->addr[0], sta->addr[1], sta->addr[2],
|
||||
sta->addr[3], sta->addr[4], sta->addr[5]);
|
||||
sta->ap = 0;
|
||||
sta->flags = 0;
|
||||
sta->u.sta.challenge = NULL;
|
||||
|
|
@ -1497,10 +1503,13 @@ static void handle_authen(local_info_t *local, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
if (resp) {
|
||||
PDEBUG(DEBUG_AP, "%s: %s auth (alg=%d "
|
||||
PDEBUG(DEBUG_AP, "%s: " MAC_FMT " auth (alg=%d "
|
||||
"trans#=%d stat=%d len=%d fc=%04x) ==> %d (%s)\n",
|
||||
dev->name, print_mac(mac, hdr->addr2), auth_alg,
|
||||
auth_transaction, status_code, len, fc, resp, txt);
|
||||
dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
auth_alg, auth_transaction, status_code, len,
|
||||
fc, resp, txt);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1519,14 +1528,15 @@ static void handle_assoc(local_info_t *local, struct sk_buff *skb,
|
|||
int send_deauth = 0;
|
||||
char *txt = "";
|
||||
u8 prev_ap[ETH_ALEN];
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
left = len = skb->len - IEEE80211_MGMT_HDR_LEN;
|
||||
|
||||
if (len < (reassoc ? 10 : 4)) {
|
||||
PDEBUG(DEBUG_AP, "%s: handle_assoc - too short payload "
|
||||
"(len=%d, reassoc=%d) from %s\n",
|
||||
dev->name, len, reassoc, print_mac(mac, hdr->addr2));
|
||||
"(len=%d, reassoc=%d) from " MAC_FMT "\n",
|
||||
dev->name, len, reassoc,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1603,9 +1613,12 @@ static void handle_assoc(local_info_t *local, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
if (left > 0) {
|
||||
PDEBUG(DEBUG_AP, "%s: assoc from %s"
|
||||
PDEBUG(DEBUG_AP, "%s: assoc from " MAC_FMT
|
||||
" with extra data (%d bytes) [",
|
||||
dev->name, print_mac(mac, hdr->addr2), left);
|
||||
dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
left);
|
||||
while (left > 0) {
|
||||
PDEBUG2(DEBUG_AP, "<%02x>", *u);
|
||||
u++; left--;
|
||||
|
|
@ -1704,10 +1717,15 @@ static void handle_assoc(local_info_t *local, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
#if 0
|
||||
PDEBUG(DEBUG_AP, "%s: %s %sassoc (len=%d "
|
||||
"prev_ap=%s) => %d(%d) (%s)\n",
|
||||
dev->name, print_mac(mac, hdr->addr2), reassoc ? "re" : "", len,
|
||||
print_mac(mac, prev_ap), resp, send_deauth, txt);
|
||||
PDEBUG(DEBUG_AP, "%s: " MAC_FMT" %sassoc (len=%d "
|
||||
"prev_ap=" MAC_FMT") => %d(%d) (%s)\n",
|
||||
dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
reassoc ? "re" : "", len,
|
||||
prev_ap[0], prev_ap[1], prev_ap[2],
|
||||
prev_ap[3], prev_ap[4], prev_ap[5],
|
||||
resp, send_deauth, txt);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1735,9 +1753,11 @@ static void handle_deauth(local_info_t *local, struct sk_buff *skb,
|
|||
pos = (__le16 *) body;
|
||||
reason_code = le16_to_cpu(*pos);
|
||||
|
||||
PDEBUG(DEBUG_AP, "%s: deauthentication: %s len=%d, "
|
||||
"reason_code=%d\n", dev->name, print_mac(mac, hdr->addr2), len,
|
||||
reason_code);
|
||||
PDEBUG(DEBUG_AP, "%s: deauthentication: " MAC_FMT " len=%d, "
|
||||
"reason_code=%d\n", dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
len, reason_code);
|
||||
|
||||
spin_lock_bh(&local->ap->sta_table_lock);
|
||||
sta = ap_get_sta(local->ap, hdr->addr2);
|
||||
|
|
@ -1748,9 +1768,11 @@ static void handle_deauth(local_info_t *local, struct sk_buff *skb,
|
|||
}
|
||||
spin_unlock_bh(&local->ap->sta_table_lock);
|
||||
if (sta == NULL) {
|
||||
printk("%s: deauthentication from %s, "
|
||||
printk("%s: deauthentication from " MAC_FMT ", "
|
||||
"reason_code=%d, but STA not authenticated\n", dev->name,
|
||||
print_mac(mac, hdr->addr2), reason_code);
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
reason_code);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1766,7 +1788,6 @@ static void handle_disassoc(local_info_t *local, struct sk_buff *skb,
|
|||
u16 reason_code;
|
||||
__le16 *pos;
|
||||
struct sta_info *sta = NULL;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
len = skb->len - IEEE80211_MGMT_HDR_LEN;
|
||||
|
||||
|
|
@ -1778,9 +1799,11 @@ static void handle_disassoc(local_info_t *local, struct sk_buff *skb,
|
|||
pos = (__le16 *) body;
|
||||
reason_code = le16_to_cpu(*pos);
|
||||
|
||||
PDEBUG(DEBUG_AP, "%s: disassociation: %s len=%d, "
|
||||
"reason_code=%d\n", dev->name, print_mac(mac, hdr->addr2), len,
|
||||
reason_code);
|
||||
PDEBUG(DEBUG_AP, "%s: disassociation: " MAC_FMT " len=%d, "
|
||||
"reason_code=%d\n", dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
len, reason_code);
|
||||
|
||||
spin_lock_bh(&local->ap->sta_table_lock);
|
||||
sta = ap_get_sta(local->ap, hdr->addr2);
|
||||
|
|
@ -1791,9 +1814,12 @@ static void handle_disassoc(local_info_t *local, struct sk_buff *skb,
|
|||
}
|
||||
spin_unlock_bh(&local->ap->sta_table_lock);
|
||||
if (sta == NULL) {
|
||||
printk("%s: disassociation from %s, "
|
||||
printk("%s: disassociation from " MAC_FMT ", "
|
||||
"reason_code=%d, but STA not authenticated\n",
|
||||
dev->name, print_mac(mac, hdr->addr2), reason_code);
|
||||
dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
reason_code);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1882,16 +1908,20 @@ static void handle_pspoll(local_info_t *local,
|
|||
struct sta_info *sta;
|
||||
u16 aid;
|
||||
struct sk_buff *skb;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
PDEBUG(DEBUG_PS2, "handle_pspoll: BSSID=%s"
|
||||
", TA=%s PWRMGT=%d\n",
|
||||
print_mac(mac, hdr->addr1), print_mac(mac, hdr->addr2),
|
||||
PDEBUG(DEBUG_PS2, "handle_pspoll: BSSID=" MAC_FMT
|
||||
", TA=" MAC_FMT " PWRMGT=%d\n",
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5],
|
||||
hdr->addr2[0], hdr->addr2[1], hdr->addr2[2],
|
||||
hdr->addr2[3], hdr->addr2[4], hdr->addr2[5],
|
||||
!!(le16_to_cpu(hdr->frame_ctl) & IEEE80211_FCTL_PM));
|
||||
|
||||
if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) {
|
||||
PDEBUG(DEBUG_AP, "handle_pspoll - addr1(BSSID)=%s"
|
||||
" not own MAC\n", print_mac(mac, hdr->addr1));
|
||||
PDEBUG(DEBUG_AP, "handle_pspoll - addr1(BSSID)=" MAC_FMT
|
||||
" not own MAC\n",
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1969,7 +1999,6 @@ static void handle_wds_oper_queue(struct work_struct *work)
|
|||
wds_oper_queue);
|
||||
local_info_t *local = ap->local;
|
||||
struct wds_oper_data *entry, *prev;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
spin_lock_bh(&local->lock);
|
||||
entry = local->ap->wds_oper_entries;
|
||||
|
|
@ -1978,10 +2007,11 @@ static void handle_wds_oper_queue(struct work_struct *work)
|
|||
|
||||
while (entry) {
|
||||
PDEBUG(DEBUG_AP, "%s: %s automatic WDS connection "
|
||||
"to AP %s\n",
|
||||
"to AP " MAC_FMT "\n",
|
||||
local->dev->name,
|
||||
entry->type == WDS_ADD ? "adding" : "removing",
|
||||
print_mac(mac, entry->addr));
|
||||
entry->addr[0], entry->addr[1], entry->addr[2],
|
||||
entry->addr[3], entry->addr[4], entry->addr[5]);
|
||||
if (entry->type == WDS_ADD)
|
||||
prism2_wds_add(local, entry->addr, 0);
|
||||
else if (entry->type == WDS_DEL)
|
||||
|
|
@ -2158,7 +2188,6 @@ static void handle_ap_item(local_info_t *local, struct sk_buff *skb,
|
|||
#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
|
||||
u16 fc, type, stype;
|
||||
struct ieee80211_hdr_4addr *hdr;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
/* FIX: should give skb->len to handler functions and check that the
|
||||
* buffer is long enough */
|
||||
|
|
@ -2187,8 +2216,9 @@ static void handle_ap_item(local_info_t *local, struct sk_buff *skb,
|
|||
|
||||
if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) {
|
||||
PDEBUG(DEBUG_AP, "handle_ap_item - addr1(BSSID)="
|
||||
"%s not own MAC\n",
|
||||
print_mac(mac, hdr->addr1));
|
||||
MAC_FMT " not own MAC\n",
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5]);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
@ -2224,14 +2254,18 @@ static void handle_ap_item(local_info_t *local, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) {
|
||||
PDEBUG(DEBUG_AP, "handle_ap_item - addr1(DA)=%s"
|
||||
" not own MAC\n", print_mac(mac, hdr->addr1));
|
||||
PDEBUG(DEBUG_AP, "handle_ap_item - addr1(DA)=" MAC_FMT
|
||||
" not own MAC\n",
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5]);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN)) {
|
||||
PDEBUG(DEBUG_AP, "handle_ap_item - addr3(BSSID)=%s"
|
||||
" not own MAC\n", print_mac(mac, hdr->addr3));
|
||||
PDEBUG(DEBUG_AP, "handle_ap_item - addr3(BSSID)=" MAC_FMT
|
||||
" not own MAC\n",
|
||||
hdr->addr3[0], hdr->addr3[1], hdr->addr3[2],
|
||||
hdr->addr3[3], hdr->addr3[4], hdr->addr3[5]);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
@ -2312,7 +2346,6 @@ static void schedule_packet_send(local_info_t *local, struct sta_info *sta)
|
|||
struct sk_buff *skb;
|
||||
struct ieee80211_hdr_4addr *hdr;
|
||||
struct hostap_80211_rx_status rx_stats;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
if (skb_queue_empty(&sta->tx_buf))
|
||||
return;
|
||||
|
|
@ -2334,7 +2367,9 @@ static void schedule_packet_send(local_info_t *local, struct sta_info *sta)
|
|||
hdr->duration_id = cpu_to_le16(sta->aid | BIT(15) | BIT(14));
|
||||
|
||||
PDEBUG(DEBUG_PS2, "%s: Scheduling buffered packet delivery for STA "
|
||||
"%s\n", local->dev->name, print_mac(mac, sta->addr));
|
||||
MAC_FMT "\n", local->dev->name,
|
||||
sta->addr[0], sta->addr[1], sta->addr[2],
|
||||
sta->addr[3], sta->addr[4], sta->addr[5]);
|
||||
|
||||
skb->dev = local->dev;
|
||||
|
||||
|
|
@ -2661,7 +2696,6 @@ static int ap_update_sta_tx_rate(struct sta_info *sta, struct net_device *dev)
|
|||
int ret = sta->tx_rate;
|
||||
struct hostap_interface *iface;
|
||||
local_info_t *local;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
iface = netdev_priv(dev);
|
||||
local = iface->local;
|
||||
|
|
@ -2689,9 +2723,12 @@ static int ap_update_sta_tx_rate(struct sta_info *sta, struct net_device *dev)
|
|||
case 3: sta->tx_rate = 110; break;
|
||||
default: sta->tx_rate = 0; break;
|
||||
}
|
||||
PDEBUG(DEBUG_AP, "%s: STA %s"
|
||||
PDEBUG(DEBUG_AP, "%s: STA " MAC_FMT
|
||||
" TX rate raised to %d\n",
|
||||
dev->name, print_mac(mac, sta->addr), sta->tx_rate);
|
||||
dev->name,
|
||||
sta->addr[0], sta->addr[1], sta->addr[2],
|
||||
sta->addr[3], sta->addr[4], sta->addr[5],
|
||||
sta->tx_rate);
|
||||
}
|
||||
sta->tx_since_last_failure = 0;
|
||||
}
|
||||
|
|
@ -2709,7 +2746,6 @@ ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx)
|
|||
int set_tim, ret;
|
||||
struct ieee80211_hdr_4addr *hdr;
|
||||
struct hostap_skb_tx_data *meta;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
meta = (struct hostap_skb_tx_data *) skb->cb;
|
||||
ret = AP_TX_CONTINUE;
|
||||
|
|
@ -2745,8 +2781,9 @@ ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx)
|
|||
* print out any errors here. */
|
||||
if (net_ratelimit()) {
|
||||
printk(KERN_DEBUG "AP: drop packet to non-associated "
|
||||
"STA %s\n",
|
||||
print_mac(mac, hdr->addr1));
|
||||
"STA " MAC_FMT "\n",
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5]);
|
||||
}
|
||||
#endif
|
||||
local->ap->tx_drop_nonassoc++;
|
||||
|
|
@ -2784,9 +2821,11 @@ ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx)
|
|||
}
|
||||
|
||||
if (skb_queue_len(&sta->tx_buf) >= STA_MAX_TX_BUFFER) {
|
||||
PDEBUG(DEBUG_PS, "%s: No more space in STA (%s"
|
||||
PDEBUG(DEBUG_PS, "%s: No more space in STA (" MAC_FMT
|
||||
")'s PS mode buffer\n",
|
||||
local->dev->name, print_mac(mac, sta->addr));
|
||||
local->dev->name,
|
||||
sta->addr[0], sta->addr[1], sta->addr[2],
|
||||
sta->addr[3], sta->addr[4], sta->addr[5]);
|
||||
/* Make sure that TIM is set for the station (it might not be
|
||||
* after AP wlan hw reset). */
|
||||
/* FIX: should fix hw reset to restore bits based on STA
|
||||
|
|
@ -2850,7 +2889,6 @@ void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb)
|
|||
struct sta_info *sta;
|
||||
struct ieee80211_hdr_4addr *hdr;
|
||||
struct hostap_skb_tx_data *meta;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
hdr = (struct ieee80211_hdr_4addr *) skb->data;
|
||||
meta = (struct hostap_skb_tx_data *) skb->cb;
|
||||
|
|
@ -2859,9 +2897,12 @@ void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb)
|
|||
sta = ap_get_sta(local->ap, hdr->addr1);
|
||||
if (!sta) {
|
||||
spin_unlock(&local->ap->sta_table_lock);
|
||||
PDEBUG(DEBUG_AP, "%s: Could not find STA %s"
|
||||
PDEBUG(DEBUG_AP, "%s: Could not find STA " MAC_FMT
|
||||
" for this TX error (@%lu)\n",
|
||||
local->dev->name, print_mac(mac, hdr->addr1), jiffies);
|
||||
local->dev->name,
|
||||
hdr->addr1[0], hdr->addr1[1], hdr->addr1[2],
|
||||
hdr->addr1[3], hdr->addr1[4], hdr->addr1[5],
|
||||
jiffies);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2888,9 +2929,11 @@ void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb)
|
|||
case 3: sta->tx_rate = 110; break;
|
||||
default: sta->tx_rate = 0; break;
|
||||
}
|
||||
PDEBUG(DEBUG_AP, "%s: STA %s"
|
||||
PDEBUG(DEBUG_AP, "%s: STA " MAC_FMT
|
||||
" TX rate lowered to %d\n",
|
||||
local->dev->name, print_mac(mac, sta->addr),
|
||||
local->dev->name,
|
||||
sta->addr[0], sta->addr[1], sta->addr[2],
|
||||
sta->addr[3], sta->addr[4], sta->addr[5],
|
||||
sta->tx_rate);
|
||||
}
|
||||
sta->tx_consecutive_exc = 0;
|
||||
|
|
@ -2956,7 +2999,6 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev,
|
|||
struct sta_info *sta;
|
||||
u16 fc, type, stype;
|
||||
struct ieee80211_hdr_4addr *hdr;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
if (local->ap == NULL)
|
||||
return AP_RX_CONTINUE;
|
||||
|
|
@ -2988,9 +3030,12 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev,
|
|||
} else {
|
||||
printk(KERN_DEBUG "%s: dropped received packet"
|
||||
" from non-associated STA "
|
||||
"%s"
|
||||
MAC_FMT
|
||||
" (type=0x%02x, subtype=0x%02x)\n",
|
||||
dev->name, print_mac(mac, hdr->addr2),
|
||||
dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1],
|
||||
hdr->addr2[2], hdr->addr2[3],
|
||||
hdr->addr2[4], hdr->addr2[5],
|
||||
type >> 2, stype >> 4);
|
||||
hostap_rx(dev, skb, rx_stats);
|
||||
#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
|
||||
|
|
@ -3025,8 +3070,11 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev,
|
|||
* being associated. */
|
||||
printk(KERN_DEBUG "%s: rejected received nullfunc "
|
||||
"frame without ToDS from not associated STA "
|
||||
"%s\n",
|
||||
dev->name, print_mac(mac, hdr->addr2));
|
||||
MAC_FMT "\n",
|
||||
dev->name,
|
||||
hdr->addr2[0], hdr->addr2[1],
|
||||
hdr->addr2[2], hdr->addr2[3],
|
||||
hdr->addr2[4], hdr->addr2[5]);
|
||||
hostap_rx(dev, skb, rx_stats);
|
||||
#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
|
||||
}
|
||||
|
|
@ -3043,9 +3091,12 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev,
|
|||
* If BSSID is own, report the dropping of this frame. */
|
||||
if (memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) {
|
||||
printk(KERN_DEBUG "%s: dropped received packet from "
|
||||
"%s with no ToDS flag "
|
||||
MAC_FMT " with no ToDS flag "
|
||||
"(type=0x%02x, subtype=0x%02x)\n", dev->name,
|
||||
print_mac(mac, hdr->addr2), type >> 2, stype >> 4);
|
||||
hdr->addr2[0], hdr->addr2[1],
|
||||
hdr->addr2[2], hdr->addr2[3],
|
||||
hdr->addr2[4], hdr->addr2[5],
|
||||
type >> 2, stype >> 4);
|
||||
hostap_dump_rx_80211(dev->name, skb, rx_stats);
|
||||
}
|
||||
ret = AP_RX_DROP;
|
||||
|
|
|
|||
|
|
@ -10192,7 +10192,6 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
|
|||
u8 id, hdr_len, unicast;
|
||||
u16 remaining_bytes;
|
||||
int fc;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
hdr_len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
|
||||
switch (priv->ieee->iw_mode) {
|
||||
|
|
@ -10203,8 +10202,10 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
|
|||
id = ipw_add_station(priv, hdr->addr1);
|
||||
if (id == IPW_INVALID_STATION) {
|
||||
IPW_WARNING("Attempt to send data to "
|
||||
"invalid cell: %s\n",
|
||||
print_mac(mac, hdr->addr1));
|
||||
"invalid cell: " MAC_FMT "\n",
|
||||
hdr->addr1[0], hdr->addr1[1],
|
||||
hdr->addr1[2], hdr->addr1[3],
|
||||
hdr->addr1[4], hdr->addr1[5]);
|
||||
goto drop;
|
||||
}
|
||||
}
|
||||
|
|
@ -11576,6 +11577,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv)
|
|||
priv->prom_priv->priv = priv;
|
||||
|
||||
strcpy(priv->prom_net_dev->name, "rtap%d");
|
||||
memcpy(priv->prom_net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
|
||||
|
||||
priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
|
||||
priv->prom_net_dev->open = ipw_prom_open;
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ config IWL4965
|
|||
runs.
|
||||
|
||||
If you want to compile the driver as a module ( = code which can be
|
||||
inserted in and remvoed from the running kernel whenever you want),
|
||||
inserted in and removed from the running kernel whenever you want),
|
||||
say M here and read <file:Documentation/kbuild/modules.txt>. The
|
||||
module will be called iwl4965.ko.
|
||||
|
||||
|
|
@ -35,7 +35,6 @@ config IWL4965_HT
|
|||
bool "Enable 802.11n HT features in iwl4965 driver"
|
||||
depends on EXPERIMENTAL
|
||||
depends on IWL4965 && IWL4965_QOS
|
||||
depends on n
|
||||
---help---
|
||||
This option enables IEEE 802.11n High Throughput features
|
||||
for the iwl4965 driver.
|
||||
|
|
@ -101,7 +100,7 @@ config IWL3945
|
|||
runs.
|
||||
|
||||
If you want to compile the driver as a module ( = code which can be
|
||||
inserted in and remvoed from the running kernel whenever you want),
|
||||
inserted in and removed from the running kernel whenever you want),
|
||||
say M here and read <file:Documentation/kbuild/modules.txt>. The
|
||||
module will be called iwl3945.ko.
|
||||
|
||||
|
|
|
|||
|
|
@ -4589,7 +4589,7 @@ static u8 iwl4965_is_fat_tx_allowed(struct iwl4965_priv *priv,
|
|||
|
||||
if (sta_ht_inf) {
|
||||
if ((!sta_ht_inf->ht_supported) ||
|
||||
(!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))
|
||||
(!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6206,11 +6206,11 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv)
|
|||
|
||||
/* At this point, the NIC is initialized and operational */
|
||||
priv->notif_missed_beacons = 0;
|
||||
set_bit(STATUS_READY, &priv->status);
|
||||
|
||||
iwl3945_reg_txpower_periodic(priv);
|
||||
|
||||
IWL_DEBUG_INFO("ALIVE processing complete.\n");
|
||||
set_bit(STATUS_READY, &priv->status);
|
||||
wake_up_interruptible(&priv->wait_command_queue);
|
||||
|
||||
if (priv->error_recovering)
|
||||
|
|
@ -8706,7 +8706,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
|||
return err;
|
||||
}
|
||||
|
||||
static void iwl3945_pci_remove(struct pci_dev *pdev)
|
||||
static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct iwl3945_priv *priv = pci_get_drvdata(pdev);
|
||||
struct list_head *p, *q;
|
||||
|
|
|
|||
|
|
@ -6628,11 +6628,11 @@ static void iwl4965_alive_start(struct iwl4965_priv *priv)
|
|||
|
||||
/* At this point, the NIC is initialized and operational */
|
||||
priv->notif_missed_beacons = 0;
|
||||
set_bit(STATUS_READY, &priv->status);
|
||||
|
||||
iwl4965_rf_kill_ct_config(priv);
|
||||
|
||||
IWL_DEBUG_INFO("ALIVE processing complete.\n");
|
||||
set_bit(STATUS_READY, &priv->status);
|
||||
wake_up_interruptible(&priv->wait_command_queue);
|
||||
|
||||
if (priv->error_recovering)
|
||||
|
|
@ -9282,7 +9282,7 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
|||
return err;
|
||||
}
|
||||
|
||||
static void iwl4965_pci_remove(struct pci_dev *pdev)
|
||||
static void __devexit iwl4965_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct iwl4965_priv *priv = pci_get_drvdata(pdev);
|
||||
struct list_head *p, *q;
|
||||
|
|
|
|||
|
|
@ -541,7 +541,7 @@ void lbs_association_worker(struct work_struct *work)
|
|||
}
|
||||
|
||||
if (find_any_ssid) {
|
||||
u8 new_mode;
|
||||
u8 new_mode = assoc_req->mode;
|
||||
|
||||
ret = lbs_find_best_network_ssid(priv, assoc_req->ssid,
|
||||
&assoc_req->ssid_len, assoc_req->mode, &new_mode);
|
||||
|
|
|
|||
|
|
@ -677,9 +677,7 @@ sbi_get_int_status_exit:
|
|||
|
||||
/* Card has a command result for us */
|
||||
if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) {
|
||||
spin_lock(&priv->driver_lock);
|
||||
ret = if_cs_receive_cmdres(priv, priv->upld_buf, &priv->upld_len);
|
||||
spin_unlock(&priv->driver_lock);
|
||||
if (ret < 0)
|
||||
lbs_pr_err("could not receive cmd from card\n");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1393,11 +1393,20 @@ int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state)
|
|||
|
||||
exit:
|
||||
/*
|
||||
* Set device mode to sleep for power management.
|
||||
* Set device mode to sleep for power management,
|
||||
* on some hardware this call seems to consistently fail.
|
||||
* From the specifications it is hard to tell why it fails,
|
||||
* and if this is a "bad thing".
|
||||
* Overall it is safe to just ignore the failure and
|
||||
* continue suspending. The only downside is that the
|
||||
* device will not be in optimal power save mode, but with
|
||||
* the radio and the other components already disabled the
|
||||
* device is as good as disabled.
|
||||
*/
|
||||
retval = rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_SLEEP);
|
||||
if (retval)
|
||||
return retval;
|
||||
WARNING(rt2x00dev, "Device failed to enter sleep state, "
|
||||
"continue suspending.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2399,10 +2399,8 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|||
* beacon frame.
|
||||
*/
|
||||
if (skb_headroom(skb) < TXD_DESC_SIZE) {
|
||||
if (pskb_expand_head(skb, TXD_DESC_SIZE, 0, GFP_ATOMIC)) {
|
||||
dev_kfree_skb(skb);
|
||||
if (pskb_expand_head(skb, TXD_DESC_SIZE, 0, GFP_ATOMIC))
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -2095,6 +2095,8 @@ static struct usb_device_id rt73usb_device_table[] = {
|
|||
{ USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
/* Conceptronic */
|
||||
{ USB_DEVICE(0x14b2, 0x3c22), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
/* Corega */
|
||||
{ USB_DEVICE(0x07aa, 0x002e), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
/* D-Link */
|
||||
{ USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
|
|
|
|||
|
|
@ -309,7 +309,7 @@ struct mmw_t
|
|||
#define MMW_EXT_ANT_INTERNAL 0x00 /* Internal antenna */
|
||||
#define MMW_EXT_ANT_EXTERNAL 0x03 /* External antenna */
|
||||
#define MMW_EXT_ANT_IQ_TEST 0x1C /* IQ test pattern (set to 0) */
|
||||
};
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Size for structure checking (if padding is correct) */
|
||||
#define MMW_SIZE 37
|
||||
|
|
|
|||
Loading…
Reference in a new issue