Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
Коммит
60717f7e76
|
@ -2368,6 +2368,7 @@ config GELIC_NET
|
|||
config GELIC_WIRELESS
|
||||
bool "PS3 Wireless support"
|
||||
depends on GELIC_NET
|
||||
select WIRELESS_EXT
|
||||
help
|
||||
This option adds the support for the wireless feature of PS3.
|
||||
If you have the wireless-less model of PS3 or have no plan to
|
||||
|
|
|
@ -2690,6 +2690,7 @@ int gelic_wl_driver_probe(struct gelic_card *card)
|
|||
return -ENOMEM;
|
||||
|
||||
/* setup net_device structure */
|
||||
SET_NETDEV_DEV(netdev, &card->dev->core);
|
||||
gelic_wl_setup_netdev_ops(netdev);
|
||||
|
||||
/* setup some of net_device and register it */
|
||||
|
|
|
@ -32,6 +32,7 @@ config B43_PCI_AUTOSELECT
|
|||
bool
|
||||
depends on B43 && SSB_PCIHOST_POSSIBLE
|
||||
select SSB_PCIHOST
|
||||
select SSB_B43_PCI_BRIDGE
|
||||
default y
|
||||
|
||||
# Auto-select SSB PCICORE driver, if possible
|
||||
|
|
|
@ -25,6 +25,7 @@ config B43LEGACY_PCI_AUTOSELECT
|
|||
bool
|
||||
depends on B43LEGACY && SSB_PCIHOST_POSSIBLE
|
||||
select SSB_PCIHOST
|
||||
select SSB_B43_PCI_BRIDGE
|
||||
default y
|
||||
|
||||
# Auto-select SSB PCICORE driver, if possible
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config BCM43XX
|
||||
tristate "Broadcom BCM43xx wireless support (DEPRECATED)"
|
||||
depends on PCI && IEEE80211 && IEEE80211_SOFTMAC && WLAN_80211 && EXPERIMENTAL
|
||||
depends on PCI && IEEE80211 && IEEE80211_SOFTMAC && WLAN_80211 && (!SSB_B43_PCI_BRIDGE || SSB != y) && EXPERIMENTAL
|
||||
select WIRELESS_EXT
|
||||
select FW_LOADER
|
||||
select HW_RANDOM
|
||||
|
|
|
@ -1040,7 +1040,6 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
|
|||
lbs_deb_leave(LBS_DEB_CMD);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lbs_mesh_access);
|
||||
|
||||
int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan)
|
||||
{
|
||||
|
@ -1576,7 +1575,6 @@ done:
|
|||
lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lbs_prepare_and_send_command);
|
||||
|
||||
/**
|
||||
* @brief This function allocates the command buffer and link
|
||||
|
|
|
@ -69,7 +69,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev);
|
|||
int lbs_remove_card(struct lbs_private *priv);
|
||||
int lbs_start_card(struct lbs_private *priv);
|
||||
int lbs_stop_card(struct lbs_private *priv);
|
||||
int lbs_reset_device(struct lbs_private *priv);
|
||||
void lbs_host_to_card_done(struct lbs_private *priv);
|
||||
|
||||
int lbs_update_channel(struct lbs_private *priv);
|
||||
|
|
|
@ -1351,8 +1351,6 @@ done:
|
|||
lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lbs_add_mesh);
|
||||
|
||||
|
||||
static void lbs_remove_mesh(struct lbs_private *priv)
|
||||
{
|
||||
|
@ -1372,7 +1370,6 @@ static void lbs_remove_mesh(struct lbs_private *priv)
|
|||
free_netdev(mesh_dev);
|
||||
lbs_deb_leave(LBS_DEB_MESH);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lbs_remove_mesh);
|
||||
|
||||
/**
|
||||
* @brief This function finds the CFP in
|
||||
|
@ -1458,20 +1455,6 @@ void lbs_interrupt(struct lbs_private *priv)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(lbs_interrupt);
|
||||
|
||||
int lbs_reset_device(struct lbs_private *priv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
lbs_deb_enter(LBS_DEB_MAIN);
|
||||
ret = lbs_prepare_and_send_command(priv, CMD_802_11_RESET,
|
||||
CMD_ACT_HALT, 0, 0, NULL);
|
||||
msleep_interruptible(10);
|
||||
|
||||
lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lbs_reset_device);
|
||||
|
||||
static int __init lbs_init_module(void)
|
||||
{
|
||||
lbs_deb_enter(LBS_DEB_MAIN);
|
||||
|
|
|
@ -228,9 +228,9 @@ struct NDIS_WLAN_BSSID_EX {
|
|||
struct NDIS_802_11_SSID Ssid;
|
||||
__le32 Privacy;
|
||||
__le32 Rssi;
|
||||
enum NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
|
||||
__le32 NetworkTypeInUse;
|
||||
struct NDIS_802_11_CONFIGURATION Configuration;
|
||||
enum NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
|
||||
__le32 InfrastructureMode;
|
||||
u8 SupportedRates[NDIS_802_11_LENGTH_RATES_EX];
|
||||
__le32 IELength;
|
||||
u8 IEs[0];
|
||||
|
@ -279,11 +279,11 @@ struct RNDIS_CONFIG_PARAMETER_INFOBUFFER {
|
|||
} __attribute__((packed));
|
||||
|
||||
/* these have to match what is in wpa_supplicant */
|
||||
enum { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP } wpa_alg;
|
||||
enum { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, CIPHER_WEP104 }
|
||||
wpa_cipher;
|
||||
enum { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, KEY_MGMT_802_1X_NO_WPA,
|
||||
KEY_MGMT_WPA_NONE } wpa_key_mgmt;
|
||||
enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP };
|
||||
enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP,
|
||||
CIPHER_WEP104 };
|
||||
enum wpa_key_mgmt { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE,
|
||||
KEY_MGMT_802_1X_NO_WPA, KEY_MGMT_WPA_NONE };
|
||||
|
||||
/*
|
||||
* private data
|
||||
|
|
|
@ -960,8 +960,12 @@ static int rt2400pci_set_device_state(struct rt2x00_dev *rt2x00dev,
|
|||
rt2400pci_disable_radio(rt2x00dev);
|
||||
break;
|
||||
case STATE_RADIO_RX_ON:
|
||||
case STATE_RADIO_RX_ON_LINK:
|
||||
rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
|
||||
break;
|
||||
case STATE_RADIO_RX_OFF:
|
||||
rt2400pci_toggle_rx(rt2x00dev, state);
|
||||
case STATE_RADIO_RX_OFF_LINK:
|
||||
rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
|
||||
break;
|
||||
case STATE_DEEP_SLEEP:
|
||||
case STATE_SLEEP:
|
||||
|
|
|
@ -1112,8 +1112,12 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev,
|
|||
rt2500pci_disable_radio(rt2x00dev);
|
||||
break;
|
||||
case STATE_RADIO_RX_ON:
|
||||
case STATE_RADIO_RX_ON_LINK:
|
||||
rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
|
||||
break;
|
||||
case STATE_RADIO_RX_OFF:
|
||||
rt2500pci_toggle_rx(rt2x00dev, state);
|
||||
case STATE_RADIO_RX_OFF_LINK:
|
||||
rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
|
||||
break;
|
||||
case STATE_DEEP_SLEEP:
|
||||
case STATE_SLEEP:
|
||||
|
|
|
@ -1001,8 +1001,12 @@ static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev,
|
|||
rt2500usb_disable_radio(rt2x00dev);
|
||||
break;
|
||||
case STATE_RADIO_RX_ON:
|
||||
case STATE_RADIO_RX_ON_LINK:
|
||||
rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
|
||||
break;
|
||||
case STATE_RADIO_RX_OFF:
|
||||
rt2500usb_toggle_rx(rt2x00dev, state);
|
||||
case STATE_RADIO_RX_OFF_LINK:
|
||||
rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
|
||||
break;
|
||||
case STATE_DEEP_SLEEP:
|
||||
case STATE_SLEEP:
|
||||
|
|
|
@ -97,12 +97,16 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
|
|||
libconf.ant.rx = rx;
|
||||
libconf.ant.tx = tx;
|
||||
|
||||
if (rx == rt2x00dev->link.ant.active.rx &&
|
||||
tx == rt2x00dev->link.ant.active.tx)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Antenna setup changes require the RX to be disabled,
|
||||
* else the changes will be ignored by the device.
|
||||
*/
|
||||
if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
|
||||
rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF_LINK);
|
||||
|
||||
/*
|
||||
* Write new antenna setup to device and reset the link tuner.
|
||||
|
@ -116,7 +120,7 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
|
|||
rt2x00dev->link.ant.active.tx = libconf.ant.tx;
|
||||
|
||||
if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
|
||||
rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK);
|
||||
}
|
||||
|
||||
void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
|
||||
|
|
|
@ -61,11 +61,33 @@ EXPORT_SYMBOL_GPL(rt2x00lib_get_ring);
|
|||
/*
|
||||
* Link tuning handlers
|
||||
*/
|
||||
static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
|
||||
void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Reset link information.
|
||||
* Both the currently active vgc level as well as
|
||||
* the link tuner counter should be reset. Resetting
|
||||
* the counter is important for devices where the
|
||||
* device should only perform link tuning during the
|
||||
* first minute after being enabled.
|
||||
*/
|
||||
rt2x00dev->link.count = 0;
|
||||
rt2x00dev->link.vgc_level = 0;
|
||||
|
||||
/*
|
||||
* Reset the link tuner.
|
||||
*/
|
||||
rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
|
||||
}
|
||||
|
||||
static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
/*
|
||||
* Clear all (possibly) pre-existing quality statistics.
|
||||
*/
|
||||
memset(&rt2x00dev->link.qual, 0, sizeof(rt2x00dev->link.qual));
|
||||
|
||||
/*
|
||||
|
@ -79,10 +101,7 @@ static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
|
|||
rt2x00dev->link.qual.rx_percentage = 50;
|
||||
rt2x00dev->link.qual.tx_percentage = 50;
|
||||
|
||||
/*
|
||||
* Reset the link tuner.
|
||||
*/
|
||||
rt2x00dev->ops->lib->reset_tuner(rt2x00dev);
|
||||
rt2x00lib_reset_link_tuner(rt2x00dev);
|
||||
|
||||
queue_delayed_work(rt2x00dev->hw->workqueue,
|
||||
&rt2x00dev->link.work, LINK_TUNE_INTERVAL);
|
||||
|
@ -93,15 +112,6 @@ static void rt2x00lib_stop_link_tuner(struct rt2x00_dev *rt2x00dev)
|
|||
cancel_delayed_work_sync(&rt2x00dev->link.work);
|
||||
}
|
||||
|
||||
void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
return;
|
||||
|
||||
rt2x00lib_stop_link_tuner(rt2x00dev);
|
||||
rt2x00lib_start_link_tuner(rt2x00dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* Ring initialization
|
||||
*/
|
||||
|
@ -260,19 +270,11 @@ static void rt2x00lib_evaluate_antenna_sample(struct rt2x00_dev *rt2x00dev)
|
|||
if (sample_a == sample_b)
|
||||
return;
|
||||
|
||||
if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) {
|
||||
if (sample_a > sample_b && rx == ANTENNA_B)
|
||||
rx = ANTENNA_A;
|
||||
else if (rx == ANTENNA_A)
|
||||
rx = ANTENNA_B;
|
||||
}
|
||||
if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY)
|
||||
rx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
|
||||
|
||||
if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY) {
|
||||
if (sample_a > sample_b && tx == ANTENNA_B)
|
||||
tx = ANTENNA_A;
|
||||
else if (tx == ANTENNA_A)
|
||||
tx = ANTENNA_B;
|
||||
}
|
||||
if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)
|
||||
tx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
|
||||
|
||||
rt2x00lib_config_antenna(rt2x00dev, rx, tx);
|
||||
}
|
||||
|
@ -293,7 +295,7 @@ static void rt2x00lib_evaluate_antenna_eval(struct rt2x00_dev *rt2x00dev)
|
|||
* sample the rssi from the other antenna to make a valid
|
||||
* comparison between the 2 antennas.
|
||||
*/
|
||||
if ((rssi_curr - rssi_old) > -5 || (rssi_curr - rssi_old) < 5)
|
||||
if (abs(rssi_curr - rssi_old) < 5)
|
||||
return;
|
||||
|
||||
rt2x00dev->link.ant.flags |= ANTENNA_MODE_SAMPLE;
|
||||
|
@ -319,15 +321,15 @@ static void rt2x00lib_evaluate_antenna(struct rt2x00_dev *rt2x00dev)
|
|||
rt2x00dev->link.ant.flags &= ~ANTENNA_TX_DIVERSITY;
|
||||
|
||||
if (rt2x00dev->hw->conf.antenna_sel_rx == 0 &&
|
||||
rt2x00dev->default_ant.rx != ANTENNA_SW_DIVERSITY)
|
||||
rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY)
|
||||
rt2x00dev->link.ant.flags |= ANTENNA_RX_DIVERSITY;
|
||||
if (rt2x00dev->hw->conf.antenna_sel_tx == 0 &&
|
||||
rt2x00dev->default_ant.tx != ANTENNA_SW_DIVERSITY)
|
||||
rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY)
|
||||
rt2x00dev->link.ant.flags |= ANTENNA_TX_DIVERSITY;
|
||||
|
||||
if (!(rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) &&
|
||||
!(rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)) {
|
||||
rt2x00dev->link.ant.flags &= ~ANTENNA_MODE_SAMPLE;
|
||||
rt2x00dev->link.ant.flags = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -440,17 +442,18 @@ static void rt2x00lib_link_tuner(struct work_struct *work)
|
|||
if (!test_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags))
|
||||
rt2x00dev->ops->lib->link_tuner(rt2x00dev);
|
||||
|
||||
/*
|
||||
* Evaluate antenna setup.
|
||||
*/
|
||||
rt2x00lib_evaluate_antenna(rt2x00dev);
|
||||
|
||||
/*
|
||||
* Precalculate a portion of the link signal which is
|
||||
* in based on the tx/rx success/failure counters.
|
||||
*/
|
||||
rt2x00lib_precalculate_link_signal(&rt2x00dev->link.qual);
|
||||
|
||||
/*
|
||||
* Evaluate antenna setup, make this the last step since this could
|
||||
* possibly reset some statistics.
|
||||
*/
|
||||
rt2x00lib_evaluate_antenna(rt2x00dev);
|
||||
|
||||
/*
|
||||
* Increase tuner counter, and reschedule the next link tuner run.
|
||||
*/
|
||||
|
|
|
@ -85,6 +85,8 @@ enum dev_state {
|
|||
STATE_RADIO_OFF,
|
||||
STATE_RADIO_RX_ON,
|
||||
STATE_RADIO_RX_OFF,
|
||||
STATE_RADIO_RX_ON_LINK,
|
||||
STATE_RADIO_RX_OFF_LINK,
|
||||
STATE_RADIO_IRQ_ON,
|
||||
STATE_RADIO_IRQ_OFF,
|
||||
};
|
||||
|
|
|
@ -1482,8 +1482,12 @@ static int rt61pci_set_device_state(struct rt2x00_dev *rt2x00dev,
|
|||
rt61pci_disable_radio(rt2x00dev);
|
||||
break;
|
||||
case STATE_RADIO_RX_ON:
|
||||
case STATE_RADIO_RX_ON_LINK:
|
||||
rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
|
||||
break;
|
||||
case STATE_RADIO_RX_OFF:
|
||||
rt61pci_toggle_rx(rt2x00dev, state);
|
||||
case STATE_RADIO_RX_OFF_LINK:
|
||||
rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
|
||||
break;
|
||||
case STATE_DEEP_SLEEP:
|
||||
case STATE_SLEEP:
|
||||
|
|
|
@ -1208,8 +1208,12 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev,
|
|||
rt73usb_disable_radio(rt2x00dev);
|
||||
break;
|
||||
case STATE_RADIO_RX_ON:
|
||||
case STATE_RADIO_RX_ON_LINK:
|
||||
rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
|
||||
break;
|
||||
case STATE_RADIO_RX_OFF:
|
||||
rt73usb_toggle_rx(rt2x00dev, state);
|
||||
case STATE_RADIO_RX_OFF_LINK:
|
||||
rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
|
||||
break;
|
||||
case STATE_DEEP_SLEEP:
|
||||
case STATE_SLEEP:
|
||||
|
|
|
@ -35,6 +35,11 @@ config SSB_PCIHOST
|
|||
|
||||
If unsure, say Y
|
||||
|
||||
config SSB_B43_PCI_BRIDGE
|
||||
bool
|
||||
depends on SSB_PCIHOST
|
||||
default n
|
||||
|
||||
config SSB_PCMCIAHOST_POSSIBLE
|
||||
bool
|
||||
depends on SSB && (PCMCIA = y || PCMCIA = SSB) && EXPERIMENTAL
|
||||
|
|
|
@ -14,6 +14,6 @@ ssb-$(CONFIG_SSB_DRIVER_PCICORE) += driver_pcicore.o
|
|||
|
||||
# b43 pci-ssb-bridge driver
|
||||
# Not strictly a part of SSB, but kept here for convenience
|
||||
ssb-$(CONFIG_SSB_PCIHOST) += b43_pci_bridge.o
|
||||
ssb-$(CONFIG_SSB_B43_PCI_BRIDGE) += b43_pci_bridge.o
|
||||
|
||||
obj-$(CONFIG_SSB) += ssb.o
|
||||
|
|
|
@ -393,7 +393,7 @@ static int pcicore_is_in_hostmode(struct ssb_pcicore *pc)
|
|||
chipid_top != 0x5300)
|
||||
return 0;
|
||||
|
||||
if (bus->sprom.r1.boardflags_lo & SSB_PCICORE_BFL_NOPCI)
|
||||
if (bus->sprom.boardflags_lo & SSB_PCICORE_BFL_NOPCI)
|
||||
return 0;
|
||||
|
||||
/* The 200-pin BCM4712 package does not bond out PCI. Even when
|
||||
|
|
|
@ -120,10 +120,10 @@ extern int ssb_devices_thaw(struct ssb_bus *bus);
|
|||
extern struct ssb_bus *ssb_pci_dev_to_bus(struct pci_dev *pdev);
|
||||
|
||||
/* b43_pci_bridge.c */
|
||||
#ifdef CONFIG_SSB_PCIHOST
|
||||
#ifdef CONFIG_SSB_B43_PCI_BRIDGE
|
||||
extern int __init b43_pci_ssb_bridge_init(void);
|
||||
extern void __exit b43_pci_ssb_bridge_exit(void);
|
||||
#else /* CONFIG_SSB_PCIHOST */
|
||||
#else /* CONFIG_SSB_B43_PCI_BRIDGR */
|
||||
static inline int b43_pci_ssb_bridge_init(void)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
@ -1116,9 +1116,10 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
|
|||
/* prepare reordering buffer */
|
||||
tid_agg_rx->reorder_buf =
|
||||
kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC);
|
||||
if ((!tid_agg_rx->reorder_buf) && net_ratelimit()) {
|
||||
printk(KERN_ERR "can not allocate reordering buffer "
|
||||
"to tid %d\n", tid);
|
||||
if (!tid_agg_rx->reorder_buf) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_ERR "can not allocate reordering buffer "
|
||||
"to tid %d\n", tid);
|
||||
goto end;
|
||||
}
|
||||
memset(tid_agg_rx->reorder_buf, 0,
|
||||
|
|
Загрузка…
Ссылка в новой задаче