Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
Conflicts: drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-core.h
This commit is contained in:
commit
1fcfe76a76
|
@ -311,8 +311,10 @@ static void hci_uart_tty_close(struct tty_struct *tty)
|
|||
|
||||
if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
|
||||
hu->proto->close(hu);
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
if (hdev) {
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -311,6 +311,7 @@ struct iwl_cfg iwl100_bgn_cfg = {
|
|||
.base_params = &iwl1000_base_params,
|
||||
.ht_params = &iwl1000_ht_params,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl100_bg_cfg = {
|
||||
|
@ -324,6 +325,7 @@ struct iwl_cfg iwl100_bg_cfg = {
|
|||
.mod_params = &iwlagn_mod_params,
|
||||
.base_params = &iwl1000_base_params,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));
|
||||
|
|
|
@ -564,6 +564,7 @@ struct iwl_cfg iwl6005_2agn_cfg = {
|
|||
.need_dc_calib = true,
|
||||
.need_temp_offset_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6005_2abg_cfg = {
|
||||
|
@ -579,6 +580,7 @@ struct iwl_cfg iwl6005_2abg_cfg = {
|
|||
.need_dc_calib = true,
|
||||
.need_temp_offset_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6005_2bg_cfg = {
|
||||
|
@ -594,6 +596,7 @@ struct iwl_cfg iwl6005_2bg_cfg = {
|
|||
.need_dc_calib = true,
|
||||
.need_temp_offset_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2agn_cfg = {
|
||||
|
@ -614,6 +617,7 @@ struct iwl_cfg iwl6030_2agn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2abg_cfg = {
|
||||
|
@ -633,6 +637,7 @@ struct iwl_cfg iwl6030_2abg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2bgn_cfg = {
|
||||
|
@ -653,6 +658,7 @@ struct iwl_cfg iwl6030_2bgn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6030_2bg_cfg = {
|
||||
|
@ -672,6 +678,7 @@ struct iwl_cfg iwl6030_2bg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl1030_bgn_cfg = {
|
||||
|
@ -692,6 +699,7 @@ struct iwl_cfg iwl1030_bgn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl1030_bg_cfg = {
|
||||
|
@ -711,6 +719,7 @@ struct iwl_cfg iwl1030_bg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -793,6 +802,7 @@ struct iwl_cfg iwl6150_bgn_cfg = {
|
|||
.ht_params = &iwl6000_ht_params,
|
||||
.need_dc_calib = true,
|
||||
.led_mode = IWL_LED_RF_STATE,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_2abg_cfg = {
|
||||
|
@ -841,6 +851,7 @@ struct iwl_cfg iwl130_bgn_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl130_bg_cfg = {
|
||||
|
@ -859,6 +870,7 @@ struct iwl_cfg iwl130_bg_cfg = {
|
|||
.adv_pm = true,
|
||||
/* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
|
||||
.scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A,
|
||||
.use_new_eeprom_reading = true,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||
|
|
|
@ -433,7 +433,7 @@ static s8 iwl_update_channel_txpower(struct iwl_priv *priv,
|
|||
/**
|
||||
* iwlcore_eeprom_enhanced_txpower: process enhanced tx power info
|
||||
*/
|
||||
void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
||||
static void iwlcore_eeprom_enhanced_txpower_old(struct iwl_priv *priv)
|
||||
{
|
||||
int eeprom_section_count = 0;
|
||||
int section, element;
|
||||
|
@ -460,7 +460,8 @@ void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
|||
* always check for valid entry before process
|
||||
* the information
|
||||
*/
|
||||
if (!enhanced_txpower->common || enhanced_txpower->reserved)
|
||||
if (!(enhanced_txpower->flags || enhanced_txpower->channel) ||
|
||||
enhanced_txpower->delta_20_in_40)
|
||||
continue;
|
||||
|
||||
for (element = 0; element < eeprom_section_count; element++) {
|
||||
|
@ -493,3 +494,86 @@ void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
iwlcore_eeprom_enh_txp_read_element(struct iwl_priv *priv,
|
||||
struct iwl_eeprom_enhanced_txpwr *txp,
|
||||
s8 max_txpower_avg)
|
||||
{
|
||||
int ch_idx;
|
||||
bool is_ht40 = txp->flags & IWL_EEPROM_ENH_TXP_FL_40MHZ;
|
||||
enum ieee80211_band band;
|
||||
|
||||
band = txp->flags & IWL_EEPROM_ENH_TXP_FL_BAND_52G ?
|
||||
IEEE80211_BAND_5GHZ : IEEE80211_BAND_2GHZ;
|
||||
|
||||
for (ch_idx = 0; ch_idx < priv->channel_count; ch_idx++) {
|
||||
struct iwl_channel_info *ch_info = &priv->channel_info[ch_idx];
|
||||
|
||||
/* update matching channel or from common data only */
|
||||
if (txp->channel != 0 && ch_info->channel != txp->channel)
|
||||
continue;
|
||||
|
||||
/* update matching band only */
|
||||
if (band != ch_info->band)
|
||||
continue;
|
||||
|
||||
if (ch_info->max_power_avg < max_txpower_avg && !is_ht40) {
|
||||
ch_info->max_power_avg = max_txpower_avg;
|
||||
ch_info->curr_txpow = max_txpower_avg;
|
||||
ch_info->scan_power = max_txpower_avg;
|
||||
}
|
||||
|
||||
if (is_ht40 && ch_info->ht40_max_power_avg < max_txpower_avg)
|
||||
ch_info->ht40_max_power_avg = max_txpower_avg;
|
||||
}
|
||||
}
|
||||
|
||||
#define EEPROM_TXP_OFFS (0x00 | INDIRECT_ADDRESS | INDIRECT_TXP_LIMIT)
|
||||
#define EEPROM_TXP_ENTRY_LEN sizeof(struct iwl_eeprom_enhanced_txpwr)
|
||||
#define EEPROM_TXP_SZ_OFFS (0x00 | INDIRECT_ADDRESS | INDIRECT_TXP_LIMIT_SIZE)
|
||||
|
||||
static void iwlcore_eeprom_enhanced_txpower_new(struct iwl_priv *priv)
|
||||
{
|
||||
struct iwl_eeprom_enhanced_txpwr *txp_array, *txp;
|
||||
int idx, entries;
|
||||
__le16 *txp_len;
|
||||
s8 max_txp_avg, max_txp_avg_halfdbm;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct iwl_eeprom_enhanced_txpwr) != 8);
|
||||
|
||||
/* the length is in 16-bit words, but we want entries */
|
||||
txp_len = (__le16 *) iwlagn_eeprom_query_addr(priv, EEPROM_TXP_SZ_OFFS);
|
||||
entries = le16_to_cpup(txp_len) * 2 / EEPROM_TXP_ENTRY_LEN;
|
||||
|
||||
txp_array = (void *) iwlagn_eeprom_query_addr(priv, EEPROM_TXP_OFFS);
|
||||
for (idx = 0; idx < entries; idx++) {
|
||||
txp = &txp_array[idx];
|
||||
|
||||
/* skip invalid entries */
|
||||
if (!(txp->flags & IWL_EEPROM_ENH_TXP_FL_VALID))
|
||||
continue;
|
||||
|
||||
max_txp_avg = iwl_get_max_txpower_avg(priv, txp_array, idx,
|
||||
&max_txp_avg_halfdbm);
|
||||
|
||||
/*
|
||||
* Update the user limit values values to the highest
|
||||
* power supported by any channel
|
||||
*/
|
||||
if (max_txp_avg > priv->tx_power_user_lmt)
|
||||
priv->tx_power_user_lmt = max_txp_avg;
|
||||
if (max_txp_avg_halfdbm > priv->tx_power_lmt_in_half_dbm)
|
||||
priv->tx_power_lmt_in_half_dbm = max_txp_avg_halfdbm;
|
||||
|
||||
iwlcore_eeprom_enh_txp_read_element(priv, txp, max_txp_avg);
|
||||
}
|
||||
}
|
||||
|
||||
void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv)
|
||||
{
|
||||
if (priv->cfg->use_new_eeprom_reading)
|
||||
iwlcore_eeprom_enhanced_txpower_new(priv);
|
||||
else
|
||||
iwlcore_eeprom_enhanced_txpower_old(priv);
|
||||
}
|
||||
|
|
|
@ -568,6 +568,12 @@ static u32 eeprom_indirect_address(const struct iwl_priv *priv, u32 address)
|
|||
case INDIRECT_REGULATORY:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_REGULATORY);
|
||||
break;
|
||||
case INDIRECT_TXP_LIMIT:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_TXP_LIMIT);
|
||||
break;
|
||||
case INDIRECT_TXP_LIMIT_SIZE:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_TXP_LIMIT_SIZE);
|
||||
break;
|
||||
case INDIRECT_CALIBRATION:
|
||||
offset = iwl_eeprom_query16(priv, EEPROM_LINK_CALIBRATION);
|
||||
break;
|
||||
|
|
|
@ -412,6 +412,7 @@ struct iwl_cfg {
|
|||
u8 scan_tx_antennas[IEEE80211_NUM_BANDS];
|
||||
enum iwl_led_mode led_mode;
|
||||
const bool adv_pm;
|
||||
const bool use_new_eeprom_reading; /* temporary, remove later */
|
||||
};
|
||||
|
||||
/***************************
|
||||
|
|
|
@ -129,6 +129,17 @@ struct iwl_eeprom_channel {
|
|||
s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */
|
||||
} __packed;
|
||||
|
||||
enum iwl_eeprom_enhanced_txpwr_flags {
|
||||
IWL_EEPROM_ENH_TXP_FL_VALID = BIT(0),
|
||||
IWL_EEPROM_ENH_TXP_FL_BAND_52G = BIT(1),
|
||||
IWL_EEPROM_ENH_TXP_FL_OFDM = BIT(2),
|
||||
IWL_EEPROM_ENH_TXP_FL_40MHZ = BIT(3),
|
||||
IWL_EEPROM_ENH_TXP_FL_HT_AP = BIT(4),
|
||||
IWL_EEPROM_ENH_TXP_FL_RES1 = BIT(5),
|
||||
IWL_EEPROM_ENH_TXP_FL_RES2 = BIT(6),
|
||||
IWL_EEPROM_ENH_TXP_FL_COMMON_TYPE = BIT(7),
|
||||
};
|
||||
|
||||
/**
|
||||
* iwl_eeprom_enhanced_txpwr structure
|
||||
* This structure presents the enhanced regulatory tx power limit layout
|
||||
|
@ -136,21 +147,23 @@ struct iwl_eeprom_channel {
|
|||
* Enhanced regulatory tx power portion of eeprom image can be broken down
|
||||
* into individual structures; each one is 8 bytes in size and contain the
|
||||
* following information
|
||||
* @common: (desc + channel) not used by driver, should _NOT_ be "zero"
|
||||
* @flags: entry flags
|
||||
* @channel: channel number
|
||||
* @chain_a_max_pwr: chain a max power in 1/2 dBm
|
||||
* @chain_b_max_pwr: chain b max power in 1/2 dBm
|
||||
* @chain_c_max_pwr: chain c max power in 1/2 dBm
|
||||
* @reserved: not used, should be "zero"
|
||||
* @delta_20_in_40: 20-in-40 deltas (hi/lo)
|
||||
* @mimo2_max_pwr: mimo2 max power in 1/2 dBm
|
||||
* @mimo3_max_pwr: mimo3 max power in 1/2 dBm
|
||||
*
|
||||
*/
|
||||
struct iwl_eeprom_enhanced_txpwr {
|
||||
__le16 common;
|
||||
u8 flags;
|
||||
u8 channel;
|
||||
s8 chain_a_max;
|
||||
s8 chain_b_max;
|
||||
s8 chain_c_max;
|
||||
s8 reserved;
|
||||
u8 delta_20_in_40;
|
||||
s8 mimo2_max;
|
||||
s8 mimo3_max;
|
||||
} __packed;
|
||||
|
@ -195,6 +208,8 @@ struct iwl_eeprom_enhanced_txpwr {
|
|||
#define EEPROM_LINK_CALIBRATION (2*0x67)
|
||||
#define EEPROM_LINK_PROCESS_ADJST (2*0x68)
|
||||
#define EEPROM_LINK_OTHERS (2*0x69)
|
||||
#define EEPROM_LINK_TXP_LIMIT (2*0x6a)
|
||||
#define EEPROM_LINK_TXP_LIMIT_SIZE (2*0x6b)
|
||||
|
||||
/* agn regulatory - indirect access */
|
||||
#define EEPROM_REG_BAND_1_CHANNELS ((0x08)\
|
||||
|
@ -398,6 +413,8 @@ struct iwl_eeprom_calib_info {
|
|||
#define INDIRECT_CALIBRATION 0x00040000
|
||||
#define INDIRECT_PROCESS_ADJST 0x00050000
|
||||
#define INDIRECT_OTHERS 0x00060000
|
||||
#define INDIRECT_TXP_LIMIT 0x00070000
|
||||
#define INDIRECT_TXP_LIMIT_SIZE 0x00080000
|
||||
#define INDIRECT_ADDRESS 0x00100000
|
||||
|
||||
/* General */
|
||||
|
|
|
@ -617,7 +617,7 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
|
|||
print_ssid(ssid_buf, ssid, ssid_len),
|
||||
LBS_SCAN_RSSI_TO_MBM(rssi)/100);
|
||||
|
||||
if (channel ||
|
||||
if (channel &&
|
||||
!(channel->flags & IEEE80211_CHAN_DISABLED))
|
||||
cfg80211_inform_bss(wiphy, channel,
|
||||
bssid, le64_to_cpu(*(__le64 *)tsfdesc),
|
||||
|
|
|
@ -43,6 +43,7 @@ MODULE_FIRMWARE("isl3887usb");
|
|||
|
||||
static struct usb_device_id p54u_table[] __devinitdata = {
|
||||
/* Version 1 devices (pci chip + net2280) */
|
||||
{USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
|
||||
{USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
|
||||
{USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
|
||||
{USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
|
||||
|
@ -56,9 +57,13 @@ static struct usb_device_id p54u_table[] __devinitdata = {
|
|||
{USB_DEVICE(0x0846, 0x4220)}, /* Netgear WG111 */
|
||||
{USB_DEVICE(0x09aa, 0x1000)}, /* Spinnaker Proto board */
|
||||
{USB_DEVICE(0x0cde, 0x0006)}, /* Medion 40900, Roper Europe */
|
||||
{USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */
|
||||
{USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */
|
||||
{USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */
|
||||
{USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */
|
||||
{USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */
|
||||
{USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
|
||||
{USB_DEVICE(0x182d, 0x096b)}, /* Sitecom WL-107 */
|
||||
{USB_DEVICE(0x1915, 0x2234)}, /* Linksys WUSB54G OEM */
|
||||
{USB_DEVICE(0x1915, 0x2235)}, /* Linksys WUSB54G Portable OEM */
|
||||
{USB_DEVICE(0x2001, 0x3701)}, /* DLink DWL-G120 Spinnaker */
|
||||
|
@ -94,6 +99,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
|
|||
{USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
|
||||
{USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
|
||||
{USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
|
||||
{USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */
|
||||
{USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
|
||||
{USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
|
||||
{USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
|
||||
|
|
|
@ -311,6 +311,7 @@ static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
|
|||
d->state = BT_OPEN;
|
||||
d->flags = 0;
|
||||
d->mscex = 0;
|
||||
d->sec_level = BT_SECURITY_LOW;
|
||||
d->mtu = RFCOMM_DEFAULT_MTU;
|
||||
d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;
|
||||
|
||||
|
|
|
@ -780,6 +780,9 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|||
|
||||
mutex_lock(&sdata->u.ibss.mtx);
|
||||
|
||||
if (!sdata->u.ibss.ssid_len)
|
||||
goto mgmt_out; /* not ready to merge yet */
|
||||
|
||||
switch (fc & IEEE80211_FCTL_STYPE) {
|
||||
case IEEE80211_STYPE_PROBE_REQ:
|
||||
ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len);
|
||||
|
@ -797,6 +800,7 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|||
break;
|
||||
}
|
||||
|
||||
mgmt_out:
|
||||
mutex_unlock(&sdata->u.ibss.mtx);
|
||||
}
|
||||
|
||||
|
|
|
@ -1074,11 +1074,13 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
|
|||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_work *wk;
|
||||
bool cleanup = false;
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
list_for_each_entry(wk, &local->work_list, list) {
|
||||
if (wk->sdata != sdata)
|
||||
continue;
|
||||
cleanup = true;
|
||||
wk->type = IEEE80211_WORK_ABORT;
|
||||
wk->started = true;
|
||||
wk->timeout = jiffies;
|
||||
|
@ -1086,7 +1088,8 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
|
|||
mutex_unlock(&local->mtx);
|
||||
|
||||
/* run cleanups etc. */
|
||||
ieee80211_work_work(&local->work_work);
|
||||
if (cleanup)
|
||||
ieee80211_work_work(&local->work_work);
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
list_for_each_entry(wk, &local->work_list, list) {
|
||||
|
|
Loading…
Reference in New Issue