mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (94 commits) netfilter: ctnetlink: fix gcc warning during compilation net/netrom: Fix socket locking netlabel: Always remove the correct address selector ucc_geth.c: Fix upsmr setting in RMII mode 8139too: fix HW initial flow af_iucv: Fix race when queuing incoming iucv messages af_iucv: Test additional sk states in iucv_sock_shutdown af_iucv: Reject incoming msgs if RECV_SHUTDOWN is set af_iucv: fix oops in iucv_sock_recvmsg() for MSG_PEEK flag af_iucv: consider state IUCV_CLOSING when closing a socket iwlwifi: DMA fixes iwlwifi: add debugging for TX path mwl8: fix build warning. mac80211: fix alignment calculation bug mac80211: do not print WARN if config interface iwl3945: use cancel_delayed_work_sync to cancel rfkill_poll iwlwifi: fix EEPROM validation mask to include OTP only devices atmel: fix netdev ops conversion pcnet_cs: add cis(firmware) of the Allied Telesis LA-PCM mlx4_en: Fix cleanup if workqueue create in mlx4_en_add() fails ...
This commit is contained in:
commit
3e241ff0c5
83 changed files with 849 additions and 485 deletions
|
|
@ -1383,6 +1383,11 @@ static void rtl8139_hw_start (struct net_device *dev)
|
|||
RTL_W32_F (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0)));
|
||||
RTL_W32_F (MAC0 + 4, le16_to_cpu (*(__le16 *) (dev->dev_addr + 4)));
|
||||
|
||||
tp->cur_rx = 0;
|
||||
|
||||
/* init Rx ring buffer DMA address */
|
||||
RTL_W32_F (RxBuf, tp->rx_ring_dma);
|
||||
|
||||
/* Must enable Tx/Rx before setting transfer thresholds! */
|
||||
RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
|
||||
|
||||
|
|
@ -1390,8 +1395,6 @@ static void rtl8139_hw_start (struct net_device *dev)
|
|||
RTL_W32 (RxConfig, tp->rx_config);
|
||||
RTL_W32 (TxConfig, rtl8139_tx_config);
|
||||
|
||||
tp->cur_rx = 0;
|
||||
|
||||
rtl_check_media (dev, 1);
|
||||
|
||||
if (tp->chipset >= CH_8139B) {
|
||||
|
|
@ -1406,9 +1409,6 @@ static void rtl8139_hw_start (struct net_device *dev)
|
|||
/* Lock Config[01234] and BMCR register writes */
|
||||
RTL_W8 (Cfg9346, Cfg9346_Lock);
|
||||
|
||||
/* init Rx ring buffer DMA address */
|
||||
RTL_W32_F (RxBuf, tp->rx_ring_dma);
|
||||
|
||||
/* init Tx buffer DMA addresses */
|
||||
for (i = 0; i < NUM_TX_DESC; i++)
|
||||
RTL_W32_F (TxAddr0 + (i * 4), tp->tx_bufs_dma + (tp->tx_buf[i] - tp->tx_bufs));
|
||||
|
|
|
|||
|
|
@ -28,9 +28,9 @@ if NETDEVICES
|
|||
|
||||
config COMPAT_NET_DEV_OPS
|
||||
default y
|
||||
bool "Enable older network device API compatiablity"
|
||||
bool "Enable older network device API compatibility"
|
||||
---help---
|
||||
This option enables kernel compatiability with older network devices
|
||||
This option enables kernel compatibility with older network devices
|
||||
that do not use net_device_ops interface.
|
||||
|
||||
If unsure, say Y.
|
||||
|
|
|
|||
|
|
@ -1117,8 +1117,8 @@ static void cxgb_down(struct adapter *adapter)
|
|||
spin_unlock_irq(&adapter->work_lock);
|
||||
|
||||
free_irq_resources(adapter);
|
||||
flush_workqueue(cxgb3_wq); /* wait for external IRQ handler */
|
||||
quiesce_rx(adapter);
|
||||
flush_workqueue(cxgb3_wq); /* wait for external IRQ handler */
|
||||
}
|
||||
|
||||
static void schedule_chk_task(struct adapter *adap)
|
||||
|
|
@ -1187,6 +1187,9 @@ static int offload_close(struct t3cdev *tdev)
|
|||
|
||||
sysfs_remove_group(&tdev->lldev->dev.kobj, &offload_attr_group);
|
||||
|
||||
/* Flush work scheduled while releasing TIDs */
|
||||
flush_scheduled_work();
|
||||
|
||||
tdev->lldev = NULL;
|
||||
cxgb3_set_dummy_ops(tdev);
|
||||
t3_tp_set_offload_mode(adapter, 0);
|
||||
|
|
@ -1232,6 +1235,10 @@ static int cxgb_close(struct net_device *dev)
|
|||
struct port_info *pi = netdev_priv(dev);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
|
||||
|
||||
if (!adapter->open_device_map)
|
||||
return 0;
|
||||
|
||||
/* Stop link fault interrupts */
|
||||
t3_xgm_intr_disable(adapter, pi->port_id);
|
||||
t3_read_reg(adapter, A_XGM_INT_STATUS + pi->mac.offset);
|
||||
|
|
@ -1247,8 +1254,7 @@ static int cxgb_close(struct net_device *dev)
|
|||
spin_unlock_irq(&adapter->work_lock);
|
||||
|
||||
if (!(adapter->open_device_map & PORT_MASK))
|
||||
cancel_rearming_delayed_workqueue(cxgb3_wq,
|
||||
&adapter->adap_check_task);
|
||||
cancel_delayed_work_sync(&adapter->adap_check_task);
|
||||
|
||||
if (!adapter->open_device_map)
|
||||
cxgb_down(adapter);
|
||||
|
|
@ -2493,6 +2499,7 @@ static void check_link_status(struct adapter *adapter)
|
|||
|
||||
spin_lock_irq(&adapter->work_lock);
|
||||
if (p->link_fault) {
|
||||
t3_link_fault(adapter, i);
|
||||
spin_unlock_irq(&adapter->work_lock);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2554,9 +2561,7 @@ static void t3_adap_check_task(struct work_struct *work)
|
|||
|
||||
adapter->check_task_cnt++;
|
||||
|
||||
/* Check link status for PHYs without interrupts */
|
||||
if (p->linkpoll_period)
|
||||
check_link_status(adapter);
|
||||
check_link_status(adapter);
|
||||
|
||||
/* Accumulate MAC stats if needed */
|
||||
if (!p->linkpoll_period ||
|
||||
|
|
@ -2680,21 +2685,6 @@ void t3_os_ext_intr_handler(struct adapter *adapter)
|
|||
spin_unlock(&adapter->work_lock);
|
||||
}
|
||||
|
||||
static void link_fault_task(struct work_struct *work)
|
||||
{
|
||||
struct adapter *adapter = container_of(work, struct adapter,
|
||||
link_fault_handler_task);
|
||||
int i;
|
||||
|
||||
for_each_port(adapter, i) {
|
||||
struct net_device *netdev = adapter->port[i];
|
||||
struct port_info *pi = netdev_priv(netdev);
|
||||
|
||||
if (pi->link_fault)
|
||||
t3_link_fault(adapter, i);
|
||||
}
|
||||
}
|
||||
|
||||
void t3_os_link_fault_handler(struct adapter *adapter, int port_id)
|
||||
{
|
||||
struct net_device *netdev = adapter->port[port_id];
|
||||
|
|
@ -2702,7 +2692,6 @@ void t3_os_link_fault_handler(struct adapter *adapter, int port_id)
|
|||
|
||||
spin_lock(&adapter->work_lock);
|
||||
pi->link_fault = 1;
|
||||
queue_work(cxgb3_wq, &adapter->link_fault_handler_task);
|
||||
spin_unlock(&adapter->work_lock);
|
||||
}
|
||||
|
||||
|
|
@ -2838,6 +2827,9 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev,
|
|||
struct adapter *adapter = pci_get_drvdata(pdev);
|
||||
int ret;
|
||||
|
||||
if (state == pci_channel_io_perm_failure)
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
|
||||
ret = t3_adapter_error(adapter, 0);
|
||||
|
||||
/* Request a slot reset. */
|
||||
|
|
@ -2932,8 +2924,13 @@ static int __devinit cxgb_enable_msix(struct adapter *adap)
|
|||
while ((err = pci_enable_msix(adap->pdev, entries, vectors)) > 0)
|
||||
vectors = err;
|
||||
|
||||
if (!err && vectors < (adap->params.nports + 1))
|
||||
if (err < 0)
|
||||
pci_disable_msix(adap->pdev);
|
||||
|
||||
if (!err && vectors < (adap->params.nports + 1)) {
|
||||
pci_disable_msix(adap->pdev);
|
||||
err = -1;
|
||||
}
|
||||
|
||||
if (!err) {
|
||||
for (i = 0; i < vectors; ++i)
|
||||
|
|
@ -3082,7 +3079,6 @@ static int __devinit init_one(struct pci_dev *pdev,
|
|||
|
||||
INIT_LIST_HEAD(&adapter->adapter_list);
|
||||
INIT_WORK(&adapter->ext_intr_handler_task, ext_intr_task);
|
||||
INIT_WORK(&adapter->link_fault_handler_task, link_fault_task);
|
||||
INIT_WORK(&adapter->fatal_error_handler_task, fatal_error_task);
|
||||
INIT_DELAYED_WORK(&adapter->adap_check_task, t3_adap_check_task);
|
||||
|
||||
|
|
|
|||
|
|
@ -1202,7 +1202,6 @@ void t3_link_changed(struct adapter *adapter, int port_id)
|
|||
struct cphy *phy = &pi->phy;
|
||||
struct cmac *mac = &pi->mac;
|
||||
struct link_config *lc = &pi->link_config;
|
||||
int force_link_down = 0;
|
||||
|
||||
phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
|
||||
|
||||
|
|
@ -1218,14 +1217,9 @@ void t3_link_changed(struct adapter *adapter, int port_id)
|
|||
status = t3_read_reg(adapter, A_XGM_INT_STATUS + mac->offset);
|
||||
if (status & F_LINKFAULTCHANGE) {
|
||||
mac->stats.link_faults++;
|
||||
force_link_down = 1;
|
||||
pi->link_fault = 1;
|
||||
}
|
||||
t3_open_rx_traffic(mac, rx_cfg, rx_hash_high, rx_hash_low);
|
||||
|
||||
if (force_link_down) {
|
||||
t3_os_link_fault_handler(adapter, port_id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (lc->requested_fc & PAUSE_AUTONEG)
|
||||
|
|
@ -1292,9 +1286,6 @@ void t3_link_fault(struct adapter *adapter, int port_id)
|
|||
/* Account link faults only when the phy reports a link up */
|
||||
if (link_ok)
|
||||
mac->stats.link_faults++;
|
||||
|
||||
msleep(1000);
|
||||
t3_os_link_fault_handler(adapter, port_id);
|
||||
} else {
|
||||
if (link_ok)
|
||||
t3_write_reg(adapter, A_XGM_XAUI_ACT_CTRL + mac->offset,
|
||||
|
|
|
|||
|
|
@ -3834,7 +3834,6 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
|
|||
struct e1000_buffer *buffer_info;
|
||||
unsigned int i, eop;
|
||||
unsigned int count = 0;
|
||||
bool cleaned = false;
|
||||
unsigned int total_tx_bytes=0, total_tx_packets=0;
|
||||
|
||||
i = tx_ring->next_to_clean;
|
||||
|
|
@ -3843,7 +3842,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
|
|||
|
||||
while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
|
||||
(count < tx_ring->count)) {
|
||||
for (cleaned = false; !cleaned; count++) {
|
||||
bool cleaned = false;
|
||||
for ( ; !cleaned; count++) {
|
||||
tx_desc = E1000_TX_DESC(*tx_ring, i);
|
||||
buffer_info = &tx_ring->buffer_info[i];
|
||||
cleaned = (i == eop);
|
||||
|
|
@ -3871,7 +3871,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
|
|||
tx_ring->next_to_clean = i;
|
||||
|
||||
#define TX_WAKE_THRESHOLD 32
|
||||
if (unlikely(cleaned && netif_carrier_ok(netdev) &&
|
||||
if (unlikely(count && netif_carrier_ok(netdev) &&
|
||||
E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) {
|
||||
/* Make sure that anybody stopping the queue after this
|
||||
* sees the new next_to_clean.
|
||||
|
|
|
|||
|
|
@ -621,7 +621,6 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
|
|||
struct e1000_buffer *buffer_info;
|
||||
unsigned int i, eop;
|
||||
unsigned int count = 0;
|
||||
bool cleaned = false;
|
||||
unsigned int total_tx_bytes = 0, total_tx_packets = 0;
|
||||
|
||||
i = tx_ring->next_to_clean;
|
||||
|
|
@ -630,7 +629,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
|
|||
|
||||
while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
|
||||
(count < tx_ring->count)) {
|
||||
for (cleaned = 0; !cleaned; count++) {
|
||||
bool cleaned = false;
|
||||
for (; !cleaned; count++) {
|
||||
tx_desc = E1000_TX_DESC(*tx_ring, i);
|
||||
buffer_info = &tx_ring->buffer_info[i];
|
||||
cleaned = (i == eop);
|
||||
|
|
@ -661,8 +661,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
|
|||
tx_ring->next_to_clean = i;
|
||||
|
||||
#define TX_WAKE_THRESHOLD 32
|
||||
if (cleaned && netif_carrier_ok(netdev) &&
|
||||
e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) {
|
||||
if (count && netif_carrier_ok(netdev) &&
|
||||
e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) {
|
||||
/* Make sure that anybody stopping the queue after this
|
||||
* sees the new next_to_clean.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -290,7 +290,7 @@ s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
|
|||
s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw,
|
||||
struct ixgbe_dcb_config *dcb_config)
|
||||
{
|
||||
u32 i, reg;
|
||||
u32 i, reg, rx_pba_size;
|
||||
|
||||
/* If PFC is disabled globally then fall back to LFC. */
|
||||
if (!dcb_config->pfc_mode_enable) {
|
||||
|
|
@ -301,17 +301,23 @@ s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw,
|
|||
|
||||
/* Configure PFC Tx thresholds per TC */
|
||||
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
||||
/* Config and remember Tx */
|
||||
if (dcb_config->rx_pba_cfg == pba_equal)
|
||||
rx_pba_size = IXGBE_RXPBSIZE_64KB;
|
||||
else
|
||||
rx_pba_size = (i < 4) ? IXGBE_RXPBSIZE_80KB
|
||||
: IXGBE_RXPBSIZE_48KB;
|
||||
|
||||
reg = ((rx_pba_size >> 5) & 0xFFE0);
|
||||
if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full ||
|
||||
dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx) {
|
||||
reg = hw->fc.high_water | IXGBE_FCRTH_FCEN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
|
||||
reg = hw->fc.low_water | IXGBE_FCRTL_XONE;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg);
|
||||
} else {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), 0);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0);
|
||||
}
|
||||
dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx)
|
||||
reg |= IXGBE_FCRTL_XONE;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg);
|
||||
|
||||
reg = ((rx_pba_size >> 2) & 0xFFE0);
|
||||
if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full ||
|
||||
dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx)
|
||||
reg |= IXGBE_FCRTH_FCEN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
|
||||
}
|
||||
|
||||
/* Configure pause time (2 TCs per register) */
|
||||
|
|
|
|||
|
|
@ -2841,11 +2841,55 @@ static inline bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter)
|
|||
}
|
||||
ret = true;
|
||||
} else if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
|
||||
for (i = 0; i < dcb_i; i++) {
|
||||
adapter->rx_ring[i].reg_idx = i << 4;
|
||||
adapter->tx_ring[i].reg_idx = i << 4;
|
||||
if (dcb_i == 8) {
|
||||
/*
|
||||
* Tx TC0 starts at: descriptor queue 0
|
||||
* Tx TC1 starts at: descriptor queue 32
|
||||
* Tx TC2 starts at: descriptor queue 64
|
||||
* Tx TC3 starts at: descriptor queue 80
|
||||
* Tx TC4 starts at: descriptor queue 96
|
||||
* Tx TC5 starts at: descriptor queue 104
|
||||
* Tx TC6 starts at: descriptor queue 112
|
||||
* Tx TC7 starts at: descriptor queue 120
|
||||
*
|
||||
* Rx TC0-TC7 are offset by 16 queues each
|
||||
*/
|
||||
for (i = 0; i < 3; i++) {
|
||||
adapter->tx_ring[i].reg_idx = i << 5;
|
||||
adapter->rx_ring[i].reg_idx = i << 4;
|
||||
}
|
||||
for ( ; i < 5; i++) {
|
||||
adapter->tx_ring[i].reg_idx =
|
||||
((i + 2) << 4);
|
||||
adapter->rx_ring[i].reg_idx = i << 4;
|
||||
}
|
||||
for ( ; i < dcb_i; i++) {
|
||||
adapter->tx_ring[i].reg_idx =
|
||||
((i + 8) << 3);
|
||||
adapter->rx_ring[i].reg_idx = i << 4;
|
||||
}
|
||||
|
||||
ret = true;
|
||||
} else if (dcb_i == 4) {
|
||||
/*
|
||||
* Tx TC0 starts at: descriptor queue 0
|
||||
* Tx TC1 starts at: descriptor queue 64
|
||||
* Tx TC2 starts at: descriptor queue 96
|
||||
* Tx TC3 starts at: descriptor queue 112
|
||||
*
|
||||
* Rx TC0-TC3 are offset by 32 queues each
|
||||
*/
|
||||
adapter->tx_ring[0].reg_idx = 0;
|
||||
adapter->tx_ring[1].reg_idx = 64;
|
||||
adapter->tx_ring[2].reg_idx = 96;
|
||||
adapter->tx_ring[3].reg_idx = 112;
|
||||
for (i = 0 ; i < dcb_i; i++)
|
||||
adapter->rx_ring[i].reg_idx = i << 5;
|
||||
|
||||
ret = true;
|
||||
} else {
|
||||
ret = false;
|
||||
}
|
||||
ret = true;
|
||||
} else {
|
||||
ret = false;
|
||||
}
|
||||
|
|
@ -3946,7 +3990,7 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
|
|||
}
|
||||
hw->mac.ops.setup_sfp(hw);
|
||||
|
||||
if (!adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK)
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
|
||||
/* This will also work for DA Twinax connections */
|
||||
schedule_work(&adapter->multispeed_fiber_task);
|
||||
adapter->flags &= ~IXGBE_FLAG_IN_SFP_MOD_TASK;
|
||||
|
|
|
|||
|
|
@ -316,10 +316,11 @@ static void macb_tx(struct macb *bp)
|
|||
dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n",
|
||||
(unsigned long)status);
|
||||
|
||||
if (status & MACB_BIT(UND)) {
|
||||
if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) {
|
||||
int i;
|
||||
printk(KERN_ERR "%s: TX underrun, resetting buffers\n",
|
||||
bp->dev->name);
|
||||
printk(KERN_ERR "%s: TX %s, resetting buffers\n",
|
||||
bp->dev->name, status & MACB_BIT(UND) ?
|
||||
"underrun" : "retry limit exceeded");
|
||||
|
||||
/* Transfer ongoing, disable transmitter, to avoid confusion */
|
||||
if (status & MACB_BIT(TGO))
|
||||
|
|
@ -520,27 +521,10 @@ static int macb_poll(struct napi_struct *napi, int budget)
|
|||
macb_writel(bp, RSR, status);
|
||||
|
||||
work_done = 0;
|
||||
if (!status) {
|
||||
/*
|
||||
* This may happen if an interrupt was pending before
|
||||
* this function was called last time, and no packets
|
||||
* have been received since.
|
||||
*/
|
||||
napi_complete(napi);
|
||||
goto out;
|
||||
}
|
||||
|
||||
dev_dbg(&bp->pdev->dev, "poll: status = %08lx, budget = %d\n",
|
||||
(unsigned long)status, budget);
|
||||
|
||||
if (!(status & MACB_BIT(REC))) {
|
||||
dev_warn(&bp->pdev->dev,
|
||||
"No RX buffers complete, status = %02lx\n",
|
||||
(unsigned long)status);
|
||||
napi_complete(napi);
|
||||
goto out;
|
||||
}
|
||||
|
||||
work_done = macb_rx(bp, budget);
|
||||
if (work_done < budget)
|
||||
napi_complete(napi);
|
||||
|
|
@ -549,7 +533,6 @@ static int macb_poll(struct napi_struct *napi, int budget)
|
|||
* We've done what we can to clean the buffers. Make sure we
|
||||
* get notified when new packets arrive.
|
||||
*/
|
||||
out:
|
||||
macb_writel(bp, IER, MACB_RX_INT_FLAGS);
|
||||
|
||||
/* TODO: Handle errors */
|
||||
|
|
@ -590,7 +573,8 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
|
|||
}
|
||||
}
|
||||
|
||||
if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND)))
|
||||
if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND) |
|
||||
MACB_BIT(ISR_RLE)))
|
||||
macb_tx(bp);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -376,7 +376,8 @@ static u32 macvlan_ethtool_get_rx_csum(struct net_device *dev)
|
|||
const struct macvlan_dev *vlan = netdev_priv(dev);
|
||||
struct net_device *lowerdev = vlan->lowerdev;
|
||||
|
||||
if (lowerdev->ethtool_ops->get_rx_csum == NULL)
|
||||
if (lowerdev->ethtool_ops == NULL ||
|
||||
lowerdev->ethtool_ops->get_rx_csum == NULL)
|
||||
return 0;
|
||||
return lowerdev->ethtool_ops->get_rx_csum(lowerdev);
|
||||
}
|
||||
|
|
@ -387,7 +388,8 @@ static int macvlan_ethtool_get_settings(struct net_device *dev,
|
|||
const struct macvlan_dev *vlan = netdev_priv(dev);
|
||||
struct net_device *lowerdev = vlan->lowerdev;
|
||||
|
||||
if (!lowerdev->ethtool_ops->get_settings)
|
||||
if (!lowerdev->ethtool_ops ||
|
||||
!lowerdev->ethtool_ops->get_settings)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return lowerdev->ethtool_ops->get_settings(lowerdev, cmd);
|
||||
|
|
@ -398,7 +400,8 @@ static u32 macvlan_ethtool_get_flags(struct net_device *dev)
|
|||
const struct macvlan_dev *vlan = netdev_priv(dev);
|
||||
struct net_device *lowerdev = vlan->lowerdev;
|
||||
|
||||
if (!lowerdev->ethtool_ops->get_flags)
|
||||
if (!lowerdev->ethtool_ops ||
|
||||
!lowerdev->ethtool_ops->get_flags)
|
||||
return 0;
|
||||
return lowerdev->ethtool_ops->get_flags(lowerdev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
|
|||
mdev->workqueue = create_singlethread_workqueue("mlx4_en");
|
||||
if (!mdev->workqueue) {
|
||||
err = -ENOMEM;
|
||||
goto err_close_nic;
|
||||
goto err_mr;
|
||||
}
|
||||
|
||||
/* At this stage all non-port specific tasks are complete:
|
||||
|
|
@ -214,9 +214,8 @@ err_free_netdev:
|
|||
flush_workqueue(mdev->workqueue);
|
||||
|
||||
/* Stop event queue before we drop down to release shared SW state */
|
||||
|
||||
err_close_nic:
|
||||
destroy_workqueue(mdev->workqueue);
|
||||
|
||||
err_mr:
|
||||
mlx4_mr_free(dev, &mdev->mr);
|
||||
err_uar:
|
||||
|
|
|
|||
|
|
@ -348,11 +348,9 @@ static void mlx4_en_tx_timeout(struct net_device *dev)
|
|||
if (netif_msg_timer(priv))
|
||||
mlx4_warn(mdev, "Tx timeout called on port:%d\n", priv->port);
|
||||
|
||||
if (netif_carrier_ok(dev)) {
|
||||
priv->port_stats.tx_timeout++;
|
||||
mlx4_dbg(DRV, priv, "Scheduling watchdog\n");
|
||||
queue_work(mdev->workqueue, &priv->watchdog_task);
|
||||
}
|
||||
priv->port_stats.tx_timeout++;
|
||||
mlx4_dbg(DRV, priv, "Scheduling watchdog\n");
|
||||
queue_work(mdev->workqueue, &priv->watchdog_task);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -761,9 +759,14 @@ static void mlx4_en_restart(struct work_struct *work)
|
|||
struct net_device *dev = priv->dev;
|
||||
|
||||
mlx4_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port);
|
||||
mlx4_en_stop_port(dev);
|
||||
if (mlx4_en_start_port(dev))
|
||||
mlx4_err(mdev, "Failed restarting port %d\n", priv->port);
|
||||
|
||||
mutex_lock(&mdev->state_lock);
|
||||
if (priv->port_up) {
|
||||
mlx4_en_stop_port(dev);
|
||||
if (mlx4_en_start_port(dev))
|
||||
mlx4_err(mdev, "Failed restarting port %d\n", priv->port);
|
||||
}
|
||||
mutex_unlock(&mdev->state_lock);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1054,7 +1057,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
|
|||
* Set driver features
|
||||
*/
|
||||
dev->features |= NETIF_F_SG;
|
||||
dev->features |= NETIF_F_HW_CSUM;
|
||||
dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
dev->features |= NETIF_F_HIGHDMA;
|
||||
dev->features |= NETIF_F_HW_VLAN_TX |
|
||||
NETIF_F_HW_VLAN_RX |
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
|
|||
struct mlx4_cmd_mailbox *mailbox;
|
||||
u64 in_mod = reset << 8 | port;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
mailbox = mlx4_alloc_cmd_mailbox(mdev->dev);
|
||||
if (IS_ERR(mailbox))
|
||||
|
|
@ -165,38 +166,18 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
|
|||
|
||||
spin_lock_bh(&priv->stats_lock);
|
||||
|
||||
stats->rx_packets = be32_to_cpu(mlx4_en_stats->RTOTFRMS) -
|
||||
be32_to_cpu(mlx4_en_stats->RDROP);
|
||||
stats->tx_packets = be64_to_cpu(mlx4_en_stats->TTOT_prio_0) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_prio_1) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_prio_2) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_prio_3) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_prio_4) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_prio_5) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_prio_6) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_prio_7) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_novlan) +
|
||||
be64_to_cpu(mlx4_en_stats->TTOT_loopbk);
|
||||
stats->rx_bytes = be64_to_cpu(mlx4_en_stats->ROCT_prio_0) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_prio_1) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_prio_2) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_prio_3) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_prio_4) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_prio_5) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_prio_6) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_prio_7) +
|
||||
be64_to_cpu(mlx4_en_stats->ROCT_novlan);
|
||||
|
||||
stats->tx_bytes = be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_0) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_1) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_2) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_3) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_4) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_5) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_6) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_7) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_novlan) +
|
||||
be64_to_cpu(mlx4_en_stats->TTTLOCT_loopbk);
|
||||
stats->rx_packets = 0;
|
||||
stats->rx_bytes = 0;
|
||||
for (i = 0; i < priv->rx_ring_num; i++) {
|
||||
stats->rx_packets += priv->rx_ring[i].packets;
|
||||
stats->rx_bytes += priv->rx_ring[i].bytes;
|
||||
}
|
||||
stats->tx_packets = 0;
|
||||
stats->tx_bytes = 0;
|
||||
for (i = 0; i <= priv->tx_ring_num; i++) {
|
||||
stats->tx_packets += priv->tx_ring[i].packets;
|
||||
stats->tx_bytes += priv->tx_ring[i].bytes;
|
||||
}
|
||||
|
||||
stats->rx_errors = be64_to_cpu(mlx4_en_stats->PCS) +
|
||||
be32_to_cpu(mlx4_en_stats->RdropLength) +
|
||||
|
|
|
|||
|
|
@ -94,3 +94,9 @@ void mlx4_en_unmap_buffer(struct mlx4_buf *buf)
|
|||
|
||||
vunmap(buf->direct.buf);
|
||||
}
|
||||
|
||||
void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -436,8 +436,9 @@ int mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv)
|
|||
/* Initialize page allocators */
|
||||
err = mlx4_en_init_allocator(priv, ring);
|
||||
if (err) {
|
||||
mlx4_err(mdev, "Failed initializing ring allocator\n");
|
||||
goto err_allocator;
|
||||
mlx4_err(mdev, "Failed initializing ring allocator\n");
|
||||
ring_ind--;
|
||||
goto err_allocator;
|
||||
}
|
||||
|
||||
/* Fill Rx buffers */
|
||||
|
|
@ -467,6 +468,7 @@ int mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv)
|
|||
ring->wqres.db.dma, &ring->srq);
|
||||
if (err){
|
||||
mlx4_err(mdev, "Failed to allocate srq\n");
|
||||
ring_ind--;
|
||||
goto err_srq;
|
||||
}
|
||||
ring->srq.event = mlx4_en_srq_event;
|
||||
|
|
@ -926,12 +928,6 @@ void mlx4_en_set_default_rss_map(struct mlx4_en_priv *priv,
|
|||
}
|
||||
}
|
||||
|
||||
static void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static int mlx4_en_config_rss_qp(struct mlx4_en_priv *priv,
|
||||
int qpn, int srqn, int cqn,
|
||||
enum mlx4_qp_state *state,
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
|
|||
mlx4_err(mdev, "Failed allocating qp %d\n", ring->qpn);
|
||||
goto err_reserve;
|
||||
}
|
||||
ring->qp.event = mlx4_en_sqp_event;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -538,6 +538,7 @@ int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget);
|
|||
void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride,
|
||||
int is_tx, int rss, int qpn, int cqn, int srqn,
|
||||
struct mlx4_qp_context *context);
|
||||
void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event);
|
||||
int mlx4_en_map_buffer(struct mlx4_buf *buf);
|
||||
void mlx4_en_unmap_buffer(struct mlx4_buf *buf);
|
||||
|
||||
|
|
|
|||
|
|
@ -1758,7 +1758,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"),
|
||||
PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "LA-PCM.cis"),
|
||||
PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"),
|
||||
|
|
|
|||
|
|
@ -2101,6 +2101,9 @@ static int gelic_wl_associate_bss(struct gelic_wl_info *wl,
|
|||
if (ret) {
|
||||
pr_debug("%s: WEP/WPA setup failed %d\n", __func__,
|
||||
ret);
|
||||
ret = -EPERM;
|
||||
gelic_wl_send_iwap_event(wl, NULL);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* start association */
|
||||
|
|
|
|||
|
|
@ -2190,7 +2190,14 @@ static int tg3_nvram_read_using_eeprom(struct tg3 *tp,
|
|||
if (!(tmp & EEPROM_ADDR_COMPLETE))
|
||||
return -EBUSY;
|
||||
|
||||
*val = tr32(GRC_EEPROM_DATA);
|
||||
tmp = tr32(GRC_EEPROM_DATA);
|
||||
|
||||
/*
|
||||
* The data will always be opposite the native endian
|
||||
* format. Perform a blind byteswap to compensate.
|
||||
*/
|
||||
*val = swab32(tmp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -10663,7 +10670,13 @@ static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
|
|||
|
||||
memcpy(&data, buf + i, 4);
|
||||
|
||||
tw32(GRC_EEPROM_DATA, be32_to_cpu(data));
|
||||
/*
|
||||
* The SEEPROM interface expects the data to always be opposite
|
||||
* the native endian format. We accomplish this by reversing
|
||||
* all the operations that would have been performed on the
|
||||
* data from a call to tg3_nvram_read_be32().
|
||||
*/
|
||||
tw32(GRC_EEPROM_DATA, swab32(be32_to_cpu(data)));
|
||||
|
||||
val = tr32(GRC_EEPROM_ADDR);
|
||||
tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
|
||||
|
|
@ -12443,13 +12456,8 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)
|
|||
/* Next, try NVRAM. */
|
||||
if (!tg3_nvram_read_be32(tp, mac_offset + 0, &hi) &&
|
||||
!tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) {
|
||||
dev->dev_addr[0] = ((hi >> 16) & 0xff);
|
||||
dev->dev_addr[1] = ((hi >> 24) & 0xff);
|
||||
dev->dev_addr[2] = ((lo >> 0) & 0xff);
|
||||
dev->dev_addr[3] = ((lo >> 8) & 0xff);
|
||||
dev->dev_addr[4] = ((lo >> 16) & 0xff);
|
||||
dev->dev_addr[5] = ((lo >> 24) & 0xff);
|
||||
|
||||
memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2);
|
||||
memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo));
|
||||
}
|
||||
/* Finally just fetch it out of the MAC control regs. */
|
||||
else {
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ struct tun_file {
|
|||
atomic_t count;
|
||||
struct tun_struct *tun;
|
||||
struct net *net;
|
||||
wait_queue_head_t read_wait;
|
||||
};
|
||||
|
||||
struct tun_sock;
|
||||
|
|
@ -156,6 +155,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file)
|
|||
tfile->tun = tun;
|
||||
tun->tfile = tfile;
|
||||
dev_hold(tun->dev);
|
||||
sock_hold(tun->sk);
|
||||
atomic_inc(&tfile->count);
|
||||
|
||||
out:
|
||||
|
|
@ -165,11 +165,8 @@ out:
|
|||
|
||||
static void __tun_detach(struct tun_struct *tun)
|
||||
{
|
||||
struct tun_file *tfile = tun->tfile;
|
||||
|
||||
/* Detach from net device */
|
||||
netif_tx_lock_bh(tun->dev);
|
||||
tfile->tun = NULL;
|
||||
tun->tfile = NULL;
|
||||
netif_tx_unlock_bh(tun->dev);
|
||||
|
||||
|
|
@ -333,12 +330,19 @@ static void tun_net_uninit(struct net_device *dev)
|
|||
/* Inform the methods they need to stop using the dev.
|
||||
*/
|
||||
if (tfile) {
|
||||
wake_up_all(&tfile->read_wait);
|
||||
wake_up_all(&tun->socket.wait);
|
||||
if (atomic_dec_and_test(&tfile->count))
|
||||
__tun_detach(tun);
|
||||
}
|
||||
}
|
||||
|
||||
static void tun_free_netdev(struct net_device *dev)
|
||||
{
|
||||
struct tun_struct *tun = netdev_priv(dev);
|
||||
|
||||
sock_put(tun->sk);
|
||||
}
|
||||
|
||||
/* Net device open. */
|
||||
static int tun_net_open(struct net_device *dev)
|
||||
{
|
||||
|
|
@ -393,7 +397,7 @@ static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
/* Notify and wake up reader process */
|
||||
if (tun->flags & TUN_FASYNC)
|
||||
kill_fasync(&tun->fasync, SIGIO, POLL_IN);
|
||||
wake_up_interruptible(&tun->tfile->read_wait);
|
||||
wake_up_interruptible(&tun->socket.wait);
|
||||
return 0;
|
||||
|
||||
drop:
|
||||
|
|
@ -490,7 +494,7 @@ static unsigned int tun_chr_poll(struct file *file, poll_table * wait)
|
|||
|
||||
DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name);
|
||||
|
||||
poll_wait(file, &tfile->read_wait, wait);
|
||||
poll_wait(file, &tun->socket.wait, wait);
|
||||
|
||||
if (!skb_queue_empty(&tun->readq))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
|
|
@ -763,7 +767,7 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
|
|||
goto out;
|
||||
}
|
||||
|
||||
add_wait_queue(&tfile->read_wait, &wait);
|
||||
add_wait_queue(&tun->socket.wait, &wait);
|
||||
while (len) {
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
|
||||
|
|
@ -794,7 +798,7 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
|
|||
}
|
||||
|
||||
current->state = TASK_RUNNING;
|
||||
remove_wait_queue(&tfile->read_wait, &wait);
|
||||
remove_wait_queue(&tun->socket.wait, &wait);
|
||||
|
||||
out:
|
||||
tun_put(tun);
|
||||
|
|
@ -811,7 +815,7 @@ static void tun_setup(struct net_device *dev)
|
|||
tun->group = -1;
|
||||
|
||||
dev->ethtool_ops = &tun_ethtool_ops;
|
||||
dev->destructor = free_netdev;
|
||||
dev->destructor = tun_free_netdev;
|
||||
}
|
||||
|
||||
/* Trivial set of netlink ops to allow deleting tun or tap
|
||||
|
|
@ -848,7 +852,7 @@ static void tun_sock_write_space(struct sock *sk)
|
|||
|
||||
static void tun_sock_destruct(struct sock *sk)
|
||||
{
|
||||
dev_put(container_of(sk, struct tun_sock, sk)->tun->dev);
|
||||
free_netdev(container_of(sk, struct tun_sock, sk)->tun->dev);
|
||||
}
|
||||
|
||||
static struct proto tun_proto = {
|
||||
|
|
@ -862,7 +866,6 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|||
struct sock *sk;
|
||||
struct tun_struct *tun;
|
||||
struct net_device *dev;
|
||||
struct tun_file *tfile = file->private_data;
|
||||
int err;
|
||||
|
||||
dev = __dev_get_by_name(net, ifr->ifr_name);
|
||||
|
|
@ -920,13 +923,10 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|||
if (!sk)
|
||||
goto err_free_dev;
|
||||
|
||||
/* This ref count is for tun->sk. */
|
||||
dev_hold(dev);
|
||||
init_waitqueue_head(&tun->socket.wait);
|
||||
sock_init_data(&tun->socket, sk);
|
||||
sk->sk_write_space = tun_sock_write_space;
|
||||
sk->sk_destruct = tun_sock_destruct;
|
||||
sk->sk_sndbuf = INT_MAX;
|
||||
sk->sk_sleep = &tfile->read_wait;
|
||||
|
||||
tun->sk = sk;
|
||||
container_of(sk, struct tun_sock, sk)->tun = tun;
|
||||
|
|
@ -942,11 +942,13 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|||
err = -EINVAL;
|
||||
err = register_netdevice(tun->dev);
|
||||
if (err < 0)
|
||||
goto err_free_dev;
|
||||
goto err_free_sk;
|
||||
|
||||
sk->sk_destruct = tun_sock_destruct;
|
||||
|
||||
err = tun_attach(tun, file);
|
||||
if (err < 0)
|
||||
goto err_free_dev;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
DBG(KERN_INFO "%s: tun_set_iff\n", tun->dev->name);
|
||||
|
|
@ -1266,7 +1268,6 @@ static int tun_chr_open(struct inode *inode, struct file * file)
|
|||
atomic_set(&tfile->count, 0);
|
||||
tfile->tun = NULL;
|
||||
tfile->net = get_net(current->nsproxy->net_ns);
|
||||
init_waitqueue_head(&tfile->read_wait);
|
||||
file->private_data = tfile;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1284,14 +1285,16 @@ static int tun_chr_close(struct inode *inode, struct file *file)
|
|||
__tun_detach(tun);
|
||||
|
||||
/* If desireable, unregister the netdevice. */
|
||||
if (!(tun->flags & TUN_PERSIST)) {
|
||||
sock_put(tun->sk);
|
||||
if (!(tun->flags & TUN_PERSIST))
|
||||
unregister_netdevice(tun->dev);
|
||||
}
|
||||
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
tun = tfile->tun;
|
||||
if (tun)
|
||||
sock_put(tun->sk);
|
||||
|
||||
put_net(tfile->net);
|
||||
kfree(tfile);
|
||||
|
||||
|
|
|
|||
|
|
@ -1394,7 +1394,8 @@ static int adjust_enet_interface(struct ucc_geth_private *ugeth)
|
|||
(ugeth->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) ||
|
||||
(ugeth->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) ||
|
||||
(ugeth->phy_interface == PHY_INTERFACE_MODE_RTBI)) {
|
||||
upsmr |= UCC_GETH_UPSMR_RPM;
|
||||
if (ugeth->phy_interface != PHY_INTERFACE_MODE_RMII)
|
||||
upsmr |= UCC_GETH_UPSMR_RPM;
|
||||
switch (ugeth->max_speed) {
|
||||
case SPEED_10:
|
||||
upsmr |= UCC_GETH_UPSMR_R10M;
|
||||
|
|
|
|||
|
|
@ -899,6 +899,7 @@ static int pegasus_start_xmit(struct sk_buff *skb, struct net_device *net)
|
|||
/* cleanup should already have been scheduled */
|
||||
break;
|
||||
case -ENODEV: /* disconnect() upcoming */
|
||||
case -EPERM:
|
||||
netif_device_detach(pegasus->net);
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -6713,11 +6713,11 @@ static int airo_set_auth(struct net_device *dev,
|
|||
local->config.authType = AUTH_ENCRYPT;
|
||||
} else
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
/* Commit the changes to flags if needed */
|
||||
if (local->config.authType != currentAuthType)
|
||||
set_bit (FLAG_COMMIT, &local->flags);
|
||||
break;
|
||||
}
|
||||
|
||||
case IW_AUTH_WPA_ENABLED:
|
||||
|
|
|
|||
|
|
@ -310,7 +310,7 @@ struct ar9170_tx_control {
|
|||
|
||||
struct ar9170_rx_head {
|
||||
u8 plcp[12];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct ar9170_rx_tail {
|
||||
union {
|
||||
|
|
@ -318,16 +318,16 @@ struct ar9170_rx_tail {
|
|||
u8 rssi_ant0, rssi_ant1, rssi_ant2,
|
||||
rssi_ant0x, rssi_ant1x, rssi_ant2x,
|
||||
rssi_combined;
|
||||
};
|
||||
} __packed;
|
||||
u8 rssi[7];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
u8 evm_stream0[6], evm_stream1[6];
|
||||
u8 phy_err;
|
||||
u8 SAidx, DAidx;
|
||||
u8 error;
|
||||
u8 status;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#define AR9170_ENC_ALG_NONE 0x0
|
||||
#define AR9170_ENC_ALG_WEP64 0x1
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@ static struct usb_device_id ar9170_usb_ids[] = {
|
|||
{ USB_DEVICE(0x0cf3, 0x9170) },
|
||||
/* Atheros TG121N */
|
||||
{ USB_DEVICE(0x0cf3, 0x1001) },
|
||||
/* Cace Airpcap NX */
|
||||
{ USB_DEVICE(0xcace, 0x0300) },
|
||||
/* D-Link DWA 160A */
|
||||
{ USB_DEVICE(0x07d1, 0x3c10) },
|
||||
/* Netgear WNDA3100 */
|
||||
|
|
@ -67,6 +69,8 @@ static struct usb_device_id ar9170_usb_ids[] = {
|
|||
{ USB_DEVICE(0x0846, 0x9001) },
|
||||
/* Zydas ZD1221 */
|
||||
{ USB_DEVICE(0x0ace, 0x1221) },
|
||||
/* ZyXEL NWD271N */
|
||||
{ USB_DEVICE(0x0586, 0x3417) },
|
||||
/* Z-Com UB81 BG */
|
||||
{ USB_DEVICE(0x0cde, 0x0023) },
|
||||
/* Z-Com UB82 ABG */
|
||||
|
|
@ -619,6 +623,39 @@ static int ar9170_usb_open(struct ar9170 *ar)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ar9170_usb_init_device(struct ar9170_usb *aru)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = ar9170_usb_alloc_rx_irq_urb(aru);
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
err = ar9170_usb_alloc_rx_bulk_urbs(aru);
|
||||
if (err)
|
||||
goto err_unrx;
|
||||
|
||||
err = ar9170_usb_upload_firmware(aru);
|
||||
if (err) {
|
||||
err = ar9170_echo_test(&aru->common, 0x60d43110);
|
||||
if (err) {
|
||||
/* force user invention, by disabling the device */
|
||||
err = usb_driver_set_configuration(aru->udev, -1);
|
||||
dev_err(&aru->udev->dev, "device is in a bad state. "
|
||||
"please reconnect it!\n");
|
||||
goto err_unrx;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_unrx:
|
||||
ar9170_usb_cancel_urbs(aru);
|
||||
|
||||
err_out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ar9170_usb_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
|
|
@ -654,32 +691,16 @@ static int ar9170_usb_probe(struct usb_interface *intf,
|
|||
|
||||
err = ar9170_usb_reset(aru);
|
||||
if (err)
|
||||
goto err_unlock;
|
||||
goto err_freehw;
|
||||
|
||||
err = ar9170_usb_request_firmware(aru);
|
||||
if (err)
|
||||
goto err_unlock;
|
||||
goto err_freehw;
|
||||
|
||||
err = ar9170_usb_alloc_rx_irq_urb(aru);
|
||||
err = ar9170_usb_init_device(aru);
|
||||
if (err)
|
||||
goto err_freefw;
|
||||
|
||||
err = ar9170_usb_alloc_rx_bulk_urbs(aru);
|
||||
if (err)
|
||||
goto err_unrx;
|
||||
|
||||
err = ar9170_usb_upload_firmware(aru);
|
||||
if (err) {
|
||||
err = ar9170_echo_test(&aru->common, 0x60d43110);
|
||||
if (err) {
|
||||
/* force user invention, by disabling the device */
|
||||
err = usb_driver_set_configuration(aru->udev, -1);
|
||||
dev_err(&aru->udev->dev, "device is in a bad state. "
|
||||
"please reconnect it!\n");
|
||||
goto err_unrx;
|
||||
}
|
||||
}
|
||||
|
||||
err = ar9170_usb_open(ar);
|
||||
if (err)
|
||||
goto err_unrx;
|
||||
|
|
@ -699,7 +720,7 @@ err_freefw:
|
|||
release_firmware(aru->init_values);
|
||||
release_firmware(aru->firmware);
|
||||
|
||||
err_unlock:
|
||||
err_freehw:
|
||||
usb_set_intfdata(intf, NULL);
|
||||
usb_put_dev(udev);
|
||||
ieee80211_free_hw(ar->hw);
|
||||
|
|
@ -726,12 +747,65 @@ static void ar9170_usb_disconnect(struct usb_interface *intf)
|
|||
ieee80211_free_hw(aru->common.hw);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int ar9170_suspend(struct usb_interface *intf,
|
||||
pm_message_t message)
|
||||
{
|
||||
struct ar9170_usb *aru = usb_get_intfdata(intf);
|
||||
|
||||
if (!aru)
|
||||
return -ENODEV;
|
||||
|
||||
aru->common.state = AR9170_IDLE;
|
||||
ar9170_usb_cancel_urbs(aru);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ar9170_resume(struct usb_interface *intf)
|
||||
{
|
||||
struct ar9170_usb *aru = usb_get_intfdata(intf);
|
||||
int err;
|
||||
|
||||
if (!aru)
|
||||
return -ENODEV;
|
||||
|
||||
usb_unpoison_anchored_urbs(&aru->rx_submitted);
|
||||
usb_unpoison_anchored_urbs(&aru->tx_submitted);
|
||||
|
||||
/*
|
||||
* FIXME: firmware upload will fail on resume.
|
||||
* but this is better than a hang!
|
||||
*/
|
||||
|
||||
err = ar9170_usb_init_device(aru);
|
||||
if (err)
|
||||
goto err_unrx;
|
||||
|
||||
err = ar9170_usb_open(&aru->common);
|
||||
if (err)
|
||||
goto err_unrx;
|
||||
|
||||
return 0;
|
||||
|
||||
err_unrx:
|
||||
aru->common.state = AR9170_IDLE;
|
||||
ar9170_usb_cancel_urbs(aru);
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static struct usb_driver ar9170_driver = {
|
||||
.name = "ar9170usb",
|
||||
.probe = ar9170_usb_probe,
|
||||
.disconnect = ar9170_usb_disconnect,
|
||||
.id_table = ar9170_usb_ids,
|
||||
.soft_unbind = 1,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = ar9170_suspend,
|
||||
.resume = ar9170_resume,
|
||||
#endif /* CONFIG_PM */
|
||||
};
|
||||
|
||||
static int __init ar9170_init(void)
|
||||
|
|
|
|||
|
|
@ -250,6 +250,8 @@ static struct usb_device_id dev_table[] = {
|
|||
{ USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A) },
|
||||
/* Siemens Gigaset USB WLAN Adapter 11 */
|
||||
{ USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A) },
|
||||
/* OQO Model 01+ Internal Wi-Fi */
|
||||
{ USB_DEVICE(0x1557, 0x0002), USB_DEVICE_DATA(BOARD_505A) },
|
||||
/*
|
||||
* at76c505amx-rfmd
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -493,6 +493,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
int hdrlen, padsize, retval;
|
||||
bool decrypt_error = false;
|
||||
u8 keyix;
|
||||
__le16 fc;
|
||||
|
||||
spin_lock_bh(&sc->rx.rxbuflock);
|
||||
|
||||
|
|
@ -606,6 +607,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
/* see if any padding is done by the hw and remove it */
|
||||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
hdrlen = ieee80211_get_hdrlen_from_skb(skb);
|
||||
fc = hdr->frame_control;
|
||||
|
||||
/* The MAC header is padded to have 32-bit boundary if the
|
||||
* packet payload is non-zero. The general calculation for
|
||||
|
|
@ -690,7 +692,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
sc->rx.rxotherant = 0;
|
||||
}
|
||||
|
||||
if (ieee80211_is_beacon(hdr->frame_control) &&
|
||||
if (ieee80211_is_beacon(fc) &&
|
||||
(sc->sc_flags & SC_OP_WAIT_FOR_BEACON)) {
|
||||
sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON;
|
||||
ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP);
|
||||
|
|
|
|||
|
|
@ -1502,7 +1502,6 @@ static const struct net_device_ops atmel_netdev_ops = {
|
|||
.ndo_set_mac_address = atmel_set_mac_address,
|
||||
.ndo_start_xmit = start_tx,
|
||||
.ndo_do_ioctl = atmel_ioctl,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -555,11 +555,32 @@ address_error:
|
|||
return 1;
|
||||
}
|
||||
|
||||
static bool b43_rx_buffer_is_poisoned(struct b43_dmaring *ring, struct sk_buff *skb)
|
||||
{
|
||||
unsigned char *f = skb->data + ring->frameoffset;
|
||||
|
||||
return ((f[0] & f[1] & f[2] & f[3] & f[4] & f[5] & f[6] & f[7]) == 0xFF);
|
||||
}
|
||||
|
||||
static void b43_poison_rx_buffer(struct b43_dmaring *ring, struct sk_buff *skb)
|
||||
{
|
||||
struct b43_rxhdr_fw4 *rxhdr;
|
||||
unsigned char *frame;
|
||||
|
||||
/* This poisons the RX buffer to detect DMA failures. */
|
||||
|
||||
rxhdr = (struct b43_rxhdr_fw4 *)(skb->data);
|
||||
rxhdr->frame_len = 0;
|
||||
|
||||
B43_WARN_ON(ring->rx_buffersize < ring->frameoffset + sizeof(struct b43_plcp_hdr6) + 2);
|
||||
frame = skb->data + ring->frameoffset;
|
||||
memset(frame, 0xFF, sizeof(struct b43_plcp_hdr6) + 2 /* padding */);
|
||||
}
|
||||
|
||||
static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
||||
struct b43_dmadesc_generic *desc,
|
||||
struct b43_dmadesc_meta *meta, gfp_t gfp_flags)
|
||||
{
|
||||
struct b43_rxhdr_fw4 *rxhdr;
|
||||
dma_addr_t dmaaddr;
|
||||
struct sk_buff *skb;
|
||||
|
||||
|
|
@ -568,6 +589,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
|||
skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
|
||||
if (unlikely(!skb))
|
||||
return -ENOMEM;
|
||||
b43_poison_rx_buffer(ring, skb);
|
||||
dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0);
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
|
||||
/* ugh. try to realloc in zone_dma */
|
||||
|
|
@ -578,6 +600,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
|||
skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
|
||||
if (unlikely(!skb))
|
||||
return -ENOMEM;
|
||||
b43_poison_rx_buffer(ring, skb);
|
||||
dmaaddr = map_descbuffer(ring, skb->data,
|
||||
ring->rx_buffersize, 0);
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
|
||||
|
|
@ -592,9 +615,6 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
|||
ring->ops->fill_descriptor(ring, desc, dmaaddr,
|
||||
ring->rx_buffersize, 0, 0, 0);
|
||||
|
||||
rxhdr = (struct b43_rxhdr_fw4 *)(skb->data);
|
||||
rxhdr->frame_len = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1483,12 +1503,17 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
|
|||
len = le16_to_cpu(rxhdr->frame_len);
|
||||
} while (len == 0 && i++ < 5);
|
||||
if (unlikely(len == 0)) {
|
||||
/* recycle the descriptor buffer. */
|
||||
sync_descbuffer_for_device(ring, meta->dmaaddr,
|
||||
ring->rx_buffersize);
|
||||
goto drop;
|
||||
dmaaddr = meta->dmaaddr;
|
||||
goto drop_recycle_buffer;
|
||||
}
|
||||
}
|
||||
if (unlikely(b43_rx_buffer_is_poisoned(ring, skb))) {
|
||||
/* Something went wrong with the DMA.
|
||||
* The device did not touch the buffer and did not overwrite the poison. */
|
||||
b43dbg(ring->dev->wl, "DMA RX: Dropping poisoned buffer.\n");
|
||||
dmaaddr = meta->dmaaddr;
|
||||
goto drop_recycle_buffer;
|
||||
}
|
||||
if (unlikely(len > ring->rx_buffersize)) {
|
||||
/* The data did not fit into one descriptor buffer
|
||||
* and is split over multiple buffers.
|
||||
|
|
@ -1501,6 +1526,7 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
|
|||
while (1) {
|
||||
desc = ops->idx2desc(ring, *slot, &meta);
|
||||
/* recycle the descriptor buffer. */
|
||||
b43_poison_rx_buffer(ring, meta->skb);
|
||||
sync_descbuffer_for_device(ring, meta->dmaaddr,
|
||||
ring->rx_buffersize);
|
||||
*slot = next_slot(ring, *slot);
|
||||
|
|
@ -1519,8 +1545,7 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
|
|||
err = setup_rx_descbuffer(ring, desc, meta, GFP_ATOMIC);
|
||||
if (unlikely(err)) {
|
||||
b43dbg(ring->dev->wl, "DMA RX: setup_rx_descbuffer() failed\n");
|
||||
sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);
|
||||
goto drop;
|
||||
goto drop_recycle_buffer;
|
||||
}
|
||||
|
||||
unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0);
|
||||
|
|
@ -1530,6 +1555,11 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
|
|||
b43_rx(ring->dev, skb, rxhdr);
|
||||
drop:
|
||||
return;
|
||||
|
||||
drop_recycle_buffer:
|
||||
/* Poison and recycle the RX buffer. */
|
||||
b43_poison_rx_buffer(ring, skb);
|
||||
sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);
|
||||
}
|
||||
|
||||
void b43_dma_rx(struct b43_dmaring *ring)
|
||||
|
|
|
|||
|
|
@ -3974,6 +3974,11 @@ static void setup_struct_phy_for_init(struct b43_wldev *dev,
|
|||
phy->next_txpwr_check_time = jiffies;
|
||||
/* PHY TX errors counter. */
|
||||
atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
|
||||
|
||||
#if B43_DEBUG
|
||||
phy->phy_locked = 0;
|
||||
phy->radio_locked = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void setup_struct_wldev_for_init(struct b43_wldev *dev)
|
||||
|
|
|
|||
|
|
@ -131,12 +131,16 @@ void b43_radio_lock(struct b43_wldev *dev)
|
|||
{
|
||||
u32 macctl;
|
||||
|
||||
#if B43_DEBUG
|
||||
B43_WARN_ON(dev->phy.radio_locked);
|
||||
dev->phy.radio_locked = 1;
|
||||
#endif
|
||||
|
||||
macctl = b43_read32(dev, B43_MMIO_MACCTL);
|
||||
B43_WARN_ON(macctl & B43_MACCTL_RADIOLOCK);
|
||||
macctl |= B43_MACCTL_RADIOLOCK;
|
||||
b43_write32(dev, B43_MMIO_MACCTL, macctl);
|
||||
/* Commit the write and wait for the device
|
||||
* to exit any radio register access. */
|
||||
/* Commit the write and wait for the firmware
|
||||
* to finish any radio register access. */
|
||||
b43_read32(dev, B43_MMIO_MACCTL);
|
||||
udelay(10);
|
||||
}
|
||||
|
|
@ -145,11 +149,15 @@ void b43_radio_unlock(struct b43_wldev *dev)
|
|||
{
|
||||
u32 macctl;
|
||||
|
||||
#if B43_DEBUG
|
||||
B43_WARN_ON(!dev->phy.radio_locked);
|
||||
dev->phy.radio_locked = 0;
|
||||
#endif
|
||||
|
||||
/* Commit any write */
|
||||
b43_read16(dev, B43_MMIO_PHY_VER);
|
||||
/* unlock */
|
||||
macctl = b43_read32(dev, B43_MMIO_MACCTL);
|
||||
B43_WARN_ON(!(macctl & B43_MACCTL_RADIOLOCK));
|
||||
macctl &= ~B43_MACCTL_RADIOLOCK;
|
||||
b43_write32(dev, B43_MMIO_MACCTL, macctl);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -245,8 +245,10 @@ struct b43_phy {
|
|||
atomic_t txerr_cnt;
|
||||
|
||||
#ifdef CONFIG_B43_DEBUG
|
||||
/* PHY registers locked by b43_phy_lock()? */
|
||||
/* PHY registers locked (w.r.t. firmware) */
|
||||
bool phy_locked;
|
||||
/* Radio registers locked (w.r.t. firmware) */
|
||||
bool radio_locked;
|
||||
#endif /* B43_DEBUG */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1192,7 +1192,7 @@ int iwl3945_hw_nic_init(struct iwl_priv *priv)
|
|||
return -ENOMEM;
|
||||
}
|
||||
} else
|
||||
iwl_rx_queue_reset(priv, rxq);
|
||||
iwl3945_rx_queue_reset(priv, rxq);
|
||||
|
||||
iwl3945_rx_replenish(priv);
|
||||
|
||||
|
|
|
|||
|
|
@ -215,6 +215,7 @@ extern int iwl3945_calc_sig_qual(int rssi_dbm, int noise_dbm);
|
|||
extern int iwl3945_tx_queue_init(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq, int count, u32 id);
|
||||
extern void iwl3945_rx_replenish(void *data);
|
||||
extern void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq);
|
||||
extern void iwl3945_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq);
|
||||
extern int iwl3945_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len,
|
||||
const void *data);
|
||||
|
|
|
|||
|
|
@ -976,11 +976,9 @@ void iwl_rx_handle(struct iwl_priv *priv)
|
|||
|
||||
rxq->queue[i] = NULL;
|
||||
|
||||
dma_sync_single_range_for_cpu(
|
||||
&priv->pci_dev->dev, rxb->real_dma_addr,
|
||||
rxb->aligned_dma_addr - rxb->real_dma_addr,
|
||||
priv->hw_params.rx_buf_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
|
||||
priv->hw_params.rx_buf_size + 256,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
pkt = (struct iwl_rx_packet *)rxb->skb->data;
|
||||
|
||||
/* Reclaim a command buffer only if this packet is a response
|
||||
|
|
@ -1031,9 +1029,6 @@ void iwl_rx_handle(struct iwl_priv *priv)
|
|||
rxb->skb = NULL;
|
||||
}
|
||||
|
||||
pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
|
||||
priv->hw_params.rx_buf_size + 256,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
spin_lock_irqsave(&rxq->lock, flags);
|
||||
list_add_tail(&rxb->list, &priv->rxq.rx_used);
|
||||
spin_unlock_irqrestore(&rxq->lock, flags);
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@
|
|||
#define CSR_EEPROM_REG_MSK_DATA (0xFFFF0000)
|
||||
|
||||
/* EEPROM GP */
|
||||
#define CSR_EEPROM_GP_VALID_MSK (0x00000006)
|
||||
#define CSR_EEPROM_GP_VALID_MSK (0x00000007)
|
||||
#define CSR_EEPROM_GP_BAD_SIGNATURE (0x00000000)
|
||||
#define CSR_EEPROM_GP_IF_OWNER_MSK (0x00000180)
|
||||
|
||||
|
|
|
|||
|
|
@ -360,12 +360,16 @@ struct iwl_host_cmd {
|
|||
|
||||
/**
|
||||
* struct iwl_rx_queue - Rx queue
|
||||
* @bd: driver's pointer to buffer of receive buffer descriptors (rbd)
|
||||
* @dma_addr: bus address of buffer of receive buffer descriptors (rbd)
|
||||
* @read: Shared index to newest available Rx buffer
|
||||
* @write: Shared index to oldest written Rx packet
|
||||
* @free_count: Number of pre-allocated buffers in rx_free
|
||||
* @rx_free: list of free SKBs for use
|
||||
* @rx_used: List of Rx buffers with no SKB
|
||||
* @need_update: flag to indicate we need to update read/write index
|
||||
* @rb_stts: driver's pointer to receive buffer status
|
||||
* @rb_stts_dma: bus address of receive buffer status
|
||||
*
|
||||
* NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -799,6 +799,22 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
/* Copy MAC header from skb into command buffer */
|
||||
memcpy(tx_cmd->hdr, hdr, hdr_len);
|
||||
|
||||
|
||||
/* Total # bytes to be transmitted */
|
||||
len = (u16)skb->len;
|
||||
tx_cmd->len = cpu_to_le16(len);
|
||||
|
||||
if (info->control.hw_key)
|
||||
iwl_tx_cmd_build_hwcrypto(priv, info, tx_cmd, skb, sta_id);
|
||||
|
||||
/* TODO need this for burst mode later on */
|
||||
iwl_tx_cmd_build_basic(priv, tx_cmd, info, hdr, sta_id);
|
||||
|
||||
/* set is_hcca to 0; it probably will never be implemented */
|
||||
iwl_tx_cmd_build_rate(priv, tx_cmd, info, fc, sta_id, 0);
|
||||
|
||||
iwl_update_tx_stats(priv, le16_to_cpu(fc), len);
|
||||
|
||||
/*
|
||||
* Use the first empty entry in this queue's command buffer array
|
||||
* to contain the Tx command and MAC header concatenated together
|
||||
|
|
@ -819,21 +835,30 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
else
|
||||
len_org = 0;
|
||||
|
||||
/* Tell NIC about any 2-byte padding after MAC header */
|
||||
if (len_org)
|
||||
tx_cmd->tx_flags |= TX_CMD_FLG_MH_PAD_MSK;
|
||||
|
||||
/* Physical address of this Tx command's header (not MAC header!),
|
||||
* within command buffer array. */
|
||||
txcmd_phys = pci_map_single(priv->pci_dev,
|
||||
out_cmd, sizeof(struct iwl_cmd),
|
||||
&out_cmd->hdr, len,
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys);
|
||||
pci_unmap_len_set(&out_cmd->meta, len, sizeof(struct iwl_cmd));
|
||||
pci_unmap_len_set(&out_cmd->meta, len, len);
|
||||
/* Add buffer containing Tx command and MAC(!) header to TFD's
|
||||
* first entry */
|
||||
txcmd_phys += offsetof(struct iwl_cmd, hdr);
|
||||
priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq,
|
||||
txcmd_phys, len, 1, 0);
|
||||
|
||||
if (info->control.hw_key)
|
||||
iwl_tx_cmd_build_hwcrypto(priv, info, tx_cmd, skb, sta_id);
|
||||
if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
||||
txq->need_update = 1;
|
||||
if (qc)
|
||||
priv->stations[sta_id].tid[tid].seq_number = seq_number;
|
||||
} else {
|
||||
wait_write_ptr = 1;
|
||||
txq->need_update = 0;
|
||||
}
|
||||
|
||||
/* Set up TFD's 2nd entry to point directly to remainder of skb,
|
||||
* if any (802.11 null frames have no payload). */
|
||||
|
|
@ -846,41 +871,29 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
0, 0);
|
||||
}
|
||||
|
||||
/* Tell NIC about any 2-byte padding after MAC header */
|
||||
if (len_org)
|
||||
tx_cmd->tx_flags |= TX_CMD_FLG_MH_PAD_MSK;
|
||||
|
||||
/* Total # bytes to be transmitted */
|
||||
len = (u16)skb->len;
|
||||
tx_cmd->len = cpu_to_le16(len);
|
||||
/* TODO need this for burst mode later on */
|
||||
iwl_tx_cmd_build_basic(priv, tx_cmd, info, hdr, sta_id);
|
||||
|
||||
/* set is_hcca to 0; it probably will never be implemented */
|
||||
iwl_tx_cmd_build_rate(priv, tx_cmd, info, fc, sta_id, 0);
|
||||
|
||||
iwl_update_tx_stats(priv, le16_to_cpu(fc), len);
|
||||
|
||||
scratch_phys = txcmd_phys + sizeof(struct iwl_cmd_header) +
|
||||
offsetof(struct iwl_tx_cmd, scratch);
|
||||
offsetof(struct iwl_tx_cmd, scratch);
|
||||
|
||||
len = sizeof(struct iwl_tx_cmd) +
|
||||
sizeof(struct iwl_cmd_header) + hdr_len;
|
||||
/* take back ownership of DMA buffer to enable update */
|
||||
pci_dma_sync_single_for_cpu(priv->pci_dev, txcmd_phys,
|
||||
len, PCI_DMA_BIDIRECTIONAL);
|
||||
tx_cmd->dram_lsb_ptr = cpu_to_le32(scratch_phys);
|
||||
tx_cmd->dram_msb_ptr = iwl_get_dma_hi_addr(scratch_phys);
|
||||
|
||||
if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
||||
txq->need_update = 1;
|
||||
if (qc)
|
||||
priv->stations[sta_id].tid[tid].seq_number = seq_number;
|
||||
} else {
|
||||
wait_write_ptr = 1;
|
||||
txq->need_update = 0;
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX(priv, "sequence nr = 0X%x \n",
|
||||
le16_to_cpu(out_cmd->hdr.sequence));
|
||||
IWL_DEBUG_TX(priv, "tx_flags = 0X%x \n", le32_to_cpu(tx_cmd->tx_flags));
|
||||
iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd, sizeof(*tx_cmd));
|
||||
|
||||
iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd->hdr, hdr_len);
|
||||
|
||||
/* Set up entry for this TFD in Tx byte-count array */
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, len);
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq,
|
||||
le16_to_cpu(tx_cmd->len));
|
||||
|
||||
pci_dma_sync_single_for_device(priv->pci_dev, txcmd_phys,
|
||||
len, PCI_DMA_BIDIRECTIONAL);
|
||||
|
||||
/* Tell device the write index *just past* this latest filled TFD */
|
||||
q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
|
||||
|
|
@ -968,18 +981,9 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
INDEX_TO_SEQ(q->write_ptr));
|
||||
if (out_cmd->meta.flags & CMD_SIZE_HUGE)
|
||||
out_cmd->hdr.sequence |= SEQ_HUGE_FRAME;
|
||||
len = (idx == TFD_CMD_SLOTS) ?
|
||||
IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd);
|
||||
len = sizeof(struct iwl_cmd) - sizeof(struct iwl_cmd_meta);
|
||||
len += (idx == TFD_CMD_SLOTS) ? IWL_MAX_SCAN_SIZE : 0;
|
||||
|
||||
phys_addr = pci_map_single(priv->pci_dev, out_cmd,
|
||||
len, PCI_DMA_BIDIRECTIONAL);
|
||||
pci_unmap_addr_set(&out_cmd->meta, mapping, phys_addr);
|
||||
pci_unmap_len_set(&out_cmd->meta, len, len);
|
||||
phys_addr += offsetof(struct iwl_cmd, hdr);
|
||||
|
||||
priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq,
|
||||
phys_addr, fix_size, 1,
|
||||
U32_PAD(cmd->len));
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
switch (out_cmd->hdr.cmd) {
|
||||
|
|
@ -1007,6 +1011,15 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
/* Set up entry in queue's byte count circular buffer */
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, 0);
|
||||
|
||||
phys_addr = pci_map_single(priv->pci_dev, &out_cmd->hdr,
|
||||
fix_size, PCI_DMA_BIDIRECTIONAL);
|
||||
pci_unmap_addr_set(&out_cmd->meta, mapping, phys_addr);
|
||||
pci_unmap_len_set(&out_cmd->meta, len, fix_size);
|
||||
|
||||
priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq,
|
||||
phys_addr, fix_size, 1,
|
||||
U32_PAD(cmd->len));
|
||||
|
||||
/* Increment and update queue's write index */
|
||||
q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
|
||||
ret = iwl_txq_update_write_ptr(priv, txq);
|
||||
|
|
|
|||
|
|
@ -972,7 +972,7 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
dma_addr_t phys_addr;
|
||||
dma_addr_t txcmd_phys;
|
||||
int txq_id = skb_get_queue_mapping(skb);
|
||||
u16 len, idx, len_org, hdr_len;
|
||||
u16 len, idx, len_org, hdr_len; /* TODO: len_org is not used */
|
||||
u8 id;
|
||||
u8 unicast;
|
||||
u8 sta_id;
|
||||
|
|
@ -1074,6 +1074,40 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
/* Copy MAC header from skb into command buffer */
|
||||
memcpy(tx->hdr, hdr, hdr_len);
|
||||
|
||||
|
||||
if (info->control.hw_key)
|
||||
iwl3945_build_tx_cmd_hwcrypto(priv, info, out_cmd, skb, sta_id);
|
||||
|
||||
/* TODO need this for burst mode later on */
|
||||
iwl3945_build_tx_cmd_basic(priv, out_cmd, info, hdr, sta_id);
|
||||
|
||||
/* set is_hcca to 0; it probably will never be implemented */
|
||||
iwl3945_hw_build_tx_cmd_rate(priv, out_cmd, info, hdr, sta_id, 0);
|
||||
|
||||
/* Total # bytes to be transmitted */
|
||||
len = (u16)skb->len;
|
||||
tx->len = cpu_to_le16(len);
|
||||
|
||||
|
||||
tx->tx_flags &= ~TX_CMD_FLG_ANT_A_MSK;
|
||||
tx->tx_flags &= ~TX_CMD_FLG_ANT_B_MSK;
|
||||
|
||||
if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
||||
txq->need_update = 1;
|
||||
if (qc)
|
||||
priv->stations_39[sta_id].tid[tid].seq_number = seq_number;
|
||||
} else {
|
||||
wait_write_ptr = 1;
|
||||
txq->need_update = 0;
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX(priv, "sequence nr = 0X%x \n",
|
||||
le16_to_cpu(out_cmd->hdr.sequence));
|
||||
IWL_DEBUG_TX(priv, "tx_flags = 0X%x \n", le32_to_cpu(tx->tx_flags));
|
||||
iwl_print_hex_dump(priv, IWL_DL_TX, tx, sizeof(*tx));
|
||||
iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx->hdr,
|
||||
ieee80211_hdrlen(fc));
|
||||
|
||||
/*
|
||||
* Use the first empty entry in this queue's command buffer array
|
||||
* to contain the Tx command and MAC header concatenated together
|
||||
|
|
@ -1096,22 +1130,18 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
|
||||
/* Physical address of this Tx command's header (not MAC header!),
|
||||
* within command buffer array. */
|
||||
txcmd_phys = pci_map_single(priv->pci_dev,
|
||||
out_cmd, sizeof(struct iwl_cmd),
|
||||
PCI_DMA_TODEVICE);
|
||||
txcmd_phys = pci_map_single(priv->pci_dev, &out_cmd->hdr,
|
||||
len, PCI_DMA_TODEVICE);
|
||||
/* we do not map meta data ... so we can safely access address to
|
||||
* provide to unmap command*/
|
||||
pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys);
|
||||
pci_unmap_len_set(&out_cmd->meta, len, sizeof(struct iwl_cmd));
|
||||
/* Add buffer containing Tx command and MAC(!) header to TFD's
|
||||
* first entry */
|
||||
txcmd_phys += offsetof(struct iwl_cmd, hdr);
|
||||
pci_unmap_len_set(&out_cmd->meta, len, len);
|
||||
|
||||
/* Add buffer containing Tx command and MAC(!) header to TFD's
|
||||
* first entry */
|
||||
priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq,
|
||||
txcmd_phys, len, 1, 0);
|
||||
|
||||
if (info->control.hw_key)
|
||||
iwl3945_build_tx_cmd_hwcrypto(priv, info, out_cmd, skb, sta_id);
|
||||
|
||||
/* Set up TFD's 2nd entry to point directly to remainder of skb,
|
||||
* if any (802.11 null frames have no payload). */
|
||||
|
|
@ -1124,32 +1154,6 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
0, U32_PAD(len));
|
||||
}
|
||||
|
||||
/* Total # bytes to be transmitted */
|
||||
len = (u16)skb->len;
|
||||
tx->len = cpu_to_le16(len);
|
||||
|
||||
/* TODO need this for burst mode later on */
|
||||
iwl3945_build_tx_cmd_basic(priv, out_cmd, info, hdr, sta_id);
|
||||
|
||||
/* set is_hcca to 0; it probably will never be implemented */
|
||||
iwl3945_hw_build_tx_cmd_rate(priv, out_cmd, info, hdr, sta_id, 0);
|
||||
|
||||
tx->tx_flags &= ~TX_CMD_FLG_ANT_A_MSK;
|
||||
tx->tx_flags &= ~TX_CMD_FLG_ANT_B_MSK;
|
||||
|
||||
if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
||||
txq->need_update = 1;
|
||||
if (qc)
|
||||
priv->stations_39[sta_id].tid[tid].seq_number = seq_number;
|
||||
} else {
|
||||
wait_write_ptr = 1;
|
||||
txq->need_update = 0;
|
||||
}
|
||||
|
||||
iwl_print_hex_dump(priv, IWL_DL_TX, tx, sizeof(*tx));
|
||||
|
||||
iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx->hdr,
|
||||
ieee80211_hdrlen(fc));
|
||||
|
||||
/* Tell device the write index *just past* this latest filled TFD */
|
||||
q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
|
||||
|
|
@ -1661,6 +1665,37 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv)
|
|||
spin_unlock_irqrestore(&rxq->lock, flags);
|
||||
}
|
||||
|
||||
void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
|
||||
{
|
||||
unsigned long flags;
|
||||
int i;
|
||||
spin_lock_irqsave(&rxq->lock, flags);
|
||||
INIT_LIST_HEAD(&rxq->rx_free);
|
||||
INIT_LIST_HEAD(&rxq->rx_used);
|
||||
/* Fill the rx_used queue with _all_ of the Rx buffers */
|
||||
for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) {
|
||||
/* In the reset function, these buffers may have been allocated
|
||||
* to an SKB, so we need to unmap and free potential storage */
|
||||
if (rxq->pool[i].skb != NULL) {
|
||||
pci_unmap_single(priv->pci_dev,
|
||||
rxq->pool[i].real_dma_addr,
|
||||
priv->hw_params.rx_buf_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
priv->alloc_rxb_skb--;
|
||||
dev_kfree_skb(rxq->pool[i].skb);
|
||||
rxq->pool[i].skb = NULL;
|
||||
}
|
||||
list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
|
||||
}
|
||||
|
||||
/* Set us so that we have processed and used all buffers, but have
|
||||
* not restocked the Rx queue with fresh buffers */
|
||||
rxq->read = rxq->write = 0;
|
||||
rxq->free_count = 0;
|
||||
spin_unlock_irqrestore(&rxq->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl3945_rx_queue_reset);
|
||||
|
||||
/*
|
||||
* this should be called while priv->lock is locked
|
||||
*/
|
||||
|
|
@ -1685,6 +1720,34 @@ void iwl3945_rx_replenish(void *data)
|
|||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
/* Assumes that the skb field of the buffers in 'pool' is kept accurate.
|
||||
* If an SKB has been detached, the POOL needs to have its SKB set to NULL
|
||||
* This free routine walks the list of POOL entries and if SKB is set to
|
||||
* non NULL it is unmapped and freed
|
||||
*/
|
||||
static void iwl3945_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
|
||||
if (rxq->pool[i].skb != NULL) {
|
||||
pci_unmap_single(priv->pci_dev,
|
||||
rxq->pool[i].real_dma_addr,
|
||||
priv->hw_params.rx_buf_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
dev_kfree_skb(rxq->pool[i].skb);
|
||||
}
|
||||
}
|
||||
|
||||
pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd,
|
||||
rxq->dma_addr);
|
||||
pci_free_consistent(priv->pci_dev, sizeof(struct iwl_rb_status),
|
||||
rxq->rb_stts, rxq->rb_stts_dma);
|
||||
rxq->bd = NULL;
|
||||
rxq->rb_stts = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl3945_rx_queue_free);
|
||||
|
||||
|
||||
/* Convert linear signal-to-noise ratio into dB */
|
||||
static u8 ratio2dB[100] = {
|
||||
/* 0 1 2 3 4 5 6 7 8 9 */
|
||||
|
|
@ -1802,9 +1865,9 @@ static void iwl3945_rx_handle(struct iwl_priv *priv)
|
|||
|
||||
rxq->queue[i] = NULL;
|
||||
|
||||
pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->real_dma_addr,
|
||||
priv->hw_params.rx_buf_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
|
||||
priv->hw_params.rx_buf_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
pkt = (struct iwl_rx_packet *)rxb->skb->data;
|
||||
|
||||
/* Reclaim a command buffer only if this packet is a response
|
||||
|
|
@ -1852,9 +1915,6 @@ static void iwl3945_rx_handle(struct iwl_priv *priv)
|
|||
rxb->skb = NULL;
|
||||
}
|
||||
|
||||
pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
|
||||
priv->hw_params.rx_buf_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
spin_lock_irqsave(&rxq->lock, flags);
|
||||
list_add_tail(&rxb->list, &priv->rxq.rx_used);
|
||||
spin_unlock_irqrestore(&rxq->lock, flags);
|
||||
|
|
@ -4075,7 +4135,7 @@ static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
if (!static_key) {
|
||||
sta_id = iwl3945_hw_find_station(priv, addr);
|
||||
if (sta_id == IWL_INVALID_STATION) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - %pMnot in station map.\n",
|
||||
IWL_DEBUG_MAC80211(priv, "leave - %pM not in station map.\n",
|
||||
addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -4913,6 +4973,8 @@ static int iwl3945_setup_mac(struct iwl_priv *priv)
|
|||
|
||||
hw->wiphy->custom_regulatory = true;
|
||||
|
||||
hw->wiphy->max_scan_ssids = 1; /* WILL FIX */
|
||||
|
||||
/* Default value; 4 EDCA QOS priorities */
|
||||
hw->queues = 4;
|
||||
|
||||
|
|
@ -5194,12 +5256,12 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
|
|||
sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
|
||||
|
||||
iwl_rfkill_unregister(priv);
|
||||
cancel_delayed_work(&priv->rfkill_poll);
|
||||
cancel_delayed_work_sync(&priv->rfkill_poll);
|
||||
|
||||
iwl3945_dealloc_ucode_pci(priv);
|
||||
|
||||
if (priv->rxq.bd)
|
||||
iwl_rx_queue_free(priv, &priv->rxq);
|
||||
iwl3945_rx_queue_free(priv, &priv->rxq);
|
||||
iwl3945_hw_txq_ctx_free(priv);
|
||||
|
||||
iwl3945_unset_hw_params(priv);
|
||||
|
|
|
|||
|
|
@ -170,6 +170,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
|
|||
lbs_deb_rx("rx err: frame received with bad length\n");
|
||||
dev->stats.rx_length_errors++;
|
||||
ret = 0;
|
||||
dev_kfree_skb(skb);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
@ -181,6 +182,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
|
|||
lbs_pr_alert("rxpd not ok\n");
|
||||
dev->stats.rx_errors++;
|
||||
ret = 0;
|
||||
dev_kfree_skb(skb);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -893,8 +893,7 @@ static int mwl8k_rxq_init(struct ieee80211_hw *hw, int index)
|
|||
rx_desc->next_rx_desc_phys_addr =
|
||||
cpu_to_le32(rxq->rx_desc_dma
|
||||
+ nexti * sizeof(*rx_desc));
|
||||
rx_desc->rx_ctrl =
|
||||
cpu_to_le32(MWL8K_RX_CTRL_OWNED_BY_HOST);
|
||||
rx_desc->rx_ctrl = MWL8K_RX_CTRL_OWNED_BY_HOST;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -3720,12 +3719,12 @@ err_free_reg:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static void __devexit mwl8k_remove(struct pci_dev *pdev)
|
||||
static void __devexit mwl8k_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
printk(KERN_ERR "===>%s(%u)\n", __func__, __LINE__);
|
||||
}
|
||||
|
||||
static void __devexit mwl8k_shutdown(struct pci_dev *pdev)
|
||||
static void __devexit mwl8k_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct mwl8k_priv *priv;
|
||||
|
|
|
|||
|
|
@ -372,15 +372,13 @@ int __orinoco_hw_set_tkip_key(hermes_t *hw, int key_idx, int set_tx,
|
|||
}
|
||||
|
||||
/* Wait upto 100ms for tx queue to empty */
|
||||
k = 100;
|
||||
do {
|
||||
k--;
|
||||
for (k = 100; k > 0; k--) {
|
||||
udelay(1000);
|
||||
ret = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_TXQUEUEEMPTY,
|
||||
&xmitting);
|
||||
if (ret)
|
||||
if (ret || !xmitting)
|
||||
break;
|
||||
} while ((k > 0) && xmitting);
|
||||
}
|
||||
|
||||
if (k == 0)
|
||||
ret = -ETIMEDOUT;
|
||||
|
|
|
|||
|
|
@ -14,9 +14,9 @@
|
|||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
#ifdef CONFIG_P54_LEDS
|
||||
#include <linux/leds.h>
|
||||
#endif /* CONFIG_MAC80211_LEDS */
|
||||
#endif /* CONFIG_P54_LEDS */
|
||||
|
||||
enum p54_control_frame_types {
|
||||
P54_CONTROL_TYPE_SETUP = 0,
|
||||
|
|
@ -116,7 +116,7 @@ enum fw_state {
|
|||
FW_STATE_RESETTING,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
#ifdef CONFIG_P54_LEDS
|
||||
|
||||
#define P54_LED_MAX_NAME_LEN 31
|
||||
|
||||
|
|
@ -129,7 +129,7 @@ struct p54_led_dev {
|
|||
unsigned int registered;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_MAC80211_LEDS */
|
||||
#endif /* CONFIG_P54_LEDS */
|
||||
|
||||
struct p54_common {
|
||||
struct ieee80211_hw *hw;
|
||||
|
|
@ -177,10 +177,10 @@ struct p54_common {
|
|||
u8 privacy_caps;
|
||||
u8 rx_keycache_size;
|
||||
/* LED management */
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
#ifdef CONFIG_P54_LEDS
|
||||
struct p54_led_dev assoc_led;
|
||||
struct p54_led_dev tx_led;
|
||||
#endif /* CONFIG_MAC80211_LEDS */
|
||||
#endif /* CONFIG_P54_LEDS */
|
||||
u16 softled_state; /* bit field of glowing LEDs */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -2543,8 +2543,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
|
|||
priv->basic_rate_mask = 0x15f;
|
||||
skb_queue_head_init(&priv->tx_queue);
|
||||
dev->flags = IEEE80211_HW_RX_INCLUDES_FCS |
|
||||
IEEE80211_HW_SUPPORTS_PS |
|
||||
IEEE80211_HW_PS_NULLFUNC_STACK |
|
||||
IEEE80211_HW_SIGNAL_DBM |
|
||||
IEEE80211_HW_NOISE_DBM;
|
||||
|
||||
|
|
|
|||
|
|
@ -457,9 +457,10 @@ static int p54spi_wq_tx(struct p54s_priv *priv)
|
|||
struct ieee80211_tx_info *info;
|
||||
struct p54_tx_info *minfo;
|
||||
struct p54s_tx_info *dinfo;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_bh(&priv->tx_lock);
|
||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||
|
||||
while (!list_empty(&priv->tx_pending)) {
|
||||
entry = list_entry(priv->tx_pending.next,
|
||||
|
|
@ -467,7 +468,7 @@ static int p54spi_wq_tx(struct p54s_priv *priv)
|
|||
|
||||
list_del_init(&entry->tx_list);
|
||||
|
||||
spin_unlock_bh(&priv->tx_lock);
|
||||
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||
|
||||
dinfo = container_of((void *) entry, struct p54s_tx_info,
|
||||
tx_list);
|
||||
|
|
@ -479,16 +480,14 @@ static int p54spi_wq_tx(struct p54s_priv *priv)
|
|||
|
||||
ret = p54spi_tx_frame(priv, skb);
|
||||
|
||||
spin_lock_bh(&priv->tx_lock);
|
||||
|
||||
if (ret < 0) {
|
||||
p54_free_skb(priv->hw, skb);
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
spin_unlock_bh(&priv->tx_lock);
|
||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -498,12 +497,13 @@ static void p54spi_op_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
|
|||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct p54_tx_info *mi = (struct p54_tx_info *) info->rate_driver_data;
|
||||
struct p54s_tx_info *di = (struct p54s_tx_info *) mi->data;
|
||||
unsigned long flags;
|
||||
|
||||
BUILD_BUG_ON(sizeof(*di) > sizeof((mi->data)));
|
||||
|
||||
spin_lock_bh(&priv->tx_lock);
|
||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||
list_add_tail(&di->tx_list, &priv->tx_pending);
|
||||
spin_unlock_bh(&priv->tx_lock);
|
||||
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||
|
||||
queue_work(priv->hw->workqueue, &priv->work);
|
||||
}
|
||||
|
|
@ -604,6 +604,7 @@ out:
|
|||
static void p54spi_op_stop(struct ieee80211_hw *dev)
|
||||
{
|
||||
struct p54s_priv *priv = dev->priv;
|
||||
unsigned long flags;
|
||||
|
||||
if (mutex_lock_interruptible(&priv->mutex)) {
|
||||
/* FIXME: how to handle this error? */
|
||||
|
|
@ -615,9 +616,9 @@ static void p54spi_op_stop(struct ieee80211_hw *dev)
|
|||
cancel_work_sync(&priv->work);
|
||||
|
||||
p54spi_power_off(priv);
|
||||
spin_lock_bh(&priv->tx_lock);
|
||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||
INIT_LIST_HEAD(&priv->tx_pending);
|
||||
spin_unlock_bh(&priv->tx_lock);
|
||||
spin_unlock_irqrestore(&priv->tx_lock, flags);
|
||||
|
||||
priv->fw_state = FW_STATE_OFF;
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
|
|||
{USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */
|
||||
{USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */
|
||||
{USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
|
||||
{USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
|
||||
{USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
|
||||
{USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
|
||||
{USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
|
||||
|
|
|
|||
|
|
@ -646,10 +646,8 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
|
|||
* Register HW.
|
||||
*/
|
||||
status = ieee80211_register_hw(rt2x00dev->hw);
|
||||
if (status) {
|
||||
rt2x00lib_remove_hw(rt2x00dev);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
|
||||
set_bit(DEVICE_STATE_REGISTERED_HW, &rt2x00dev->flags);
|
||||
|
||||
|
|
|
|||
|
|
@ -369,8 +369,6 @@ int rt2x00pci_suspend(struct pci_dev *pci_dev, pm_message_t state)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
rt2x00pci_free_reg(rt2x00dev);
|
||||
|
||||
pci_save_state(pci_dev);
|
||||
pci_disable_device(pci_dev);
|
||||
return pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
|
||||
|
|
@ -381,7 +379,6 @@ int rt2x00pci_resume(struct pci_dev *pci_dev)
|
|||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pci_dev);
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
int retval;
|
||||
|
||||
if (pci_set_power_state(pci_dev, PCI_D0) ||
|
||||
pci_enable_device(pci_dev) ||
|
||||
|
|
@ -390,20 +387,7 @@ int rt2x00pci_resume(struct pci_dev *pci_dev)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
retval = rt2x00pci_alloc_reg(rt2x00dev);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
retval = rt2x00lib_resume(rt2x00dev);
|
||||
if (retval)
|
||||
goto exit_free_reg;
|
||||
|
||||
return 0;
|
||||
|
||||
exit_free_reg:
|
||||
rt2x00pci_free_reg(rt2x00dev);
|
||||
|
||||
return retval;
|
||||
return rt2x00lib_resume(rt2x00dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00pci_resume);
|
||||
#endif /* CONFIG_PM */
|
||||
|
|
|
|||
|
|
@ -702,8 +702,6 @@ int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
rt2x00usb_free_reg(rt2x00dev);
|
||||
|
||||
/*
|
||||
* Decrease usbdev refcount.
|
||||
*/
|
||||
|
|
@ -717,24 +715,10 @@ int rt2x00usb_resume(struct usb_interface *usb_intf)
|
|||
{
|
||||
struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
int retval;
|
||||
|
||||
usb_get_dev(interface_to_usbdev(usb_intf));
|
||||
|
||||
retval = rt2x00usb_alloc_reg(rt2x00dev);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
retval = rt2x00lib_resume(rt2x00dev);
|
||||
if (retval)
|
||||
goto exit_free_reg;
|
||||
|
||||
return 0;
|
||||
|
||||
exit_free_reg:
|
||||
rt2x00usb_free_reg(rt2x00dev);
|
||||
|
||||
return retval;
|
||||
return rt2x00lib_resume(rt2x00dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00usb_resume);
|
||||
#endif /* CONFIG_PM */
|
||||
|
|
|
|||
|
|
@ -2369,6 +2369,8 @@ static struct usb_device_id rt73usb_device_table[] = {
|
|||
/* Buffalo */
|
||||
{ USB_DEVICE(0x0411, 0x00d8), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x0411, 0x0116), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x0411, 0x0119), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
/* CNet */
|
||||
{ USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
|
|
|
|||
Loading…
Reference in a new issue