This is the 4.9.305 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmInmeEACgkQONu9yGCS aT54ARAAhrl/QH7fkMcoiLNuofsuCBCb1m6ZfJ2NZRVOnjCVwyeqG++l7iH2N1YV eKCHe0UMPRvaX1gD/lVmY8M4hDyH9lDGvzc7GXUsF3kU73SGXP0EyiLHZko+KaGi SgQZWAEf3fxaT6U3VxqLf5e7OAvxb3B0JWPSQ9sILm2Nupn6+k/21bU+krtH85NW MqYfrEkkPYsbJLCdtiKJGQg60nWZapPfWDYwPVodbUjVXTg6QCTU0iizwK/+09OY b5lsozVkjP0U1GNlzctX1Se2N+3PEW0dZ3JXAIGCvepsKwXrd9XAjaP510QQuY36 iQ1dWuX9ZccLyUEWV45hroMc565D8r4b7yc2aWvULdiir3o+EhjIeIH5VyGJhT9Q dEmPzf3rWTrwRi+T0IJ6+6xdpWNSqWZpdDGSliLhETMm7Y7mGT/uUZ2GRFtMdMWw Y3O4cAGAeReqa7v+UPIQxfKrHmDbgnY+gwrli944A8OxVXMt67UaAbMpVKXPu7Dx g3RC4kVX5H8lde7st1nASOTe1xNldUs/rfdQ6MXVDcd6+afZ+5CpgejYARSj0v9P t7YqsTg+Q0TN0deRnscbSbydauBatoqXw+KafK8DqWille7W6wQvsOsAgYyj48N5 bE1Fic1ue3TLhCEND/439m2KB7/7qMYEaRzV+l0Y80yVg9NarZk= =ON4i -----END PGP SIGNATURE----- Merge 4.9.305 into android-4.9-q Changes in 4.9.305 mac80211_hwsim: report NOACK frames in tx_status mac80211_hwsim: initialize ieee80211_tx_info at hw_scan_work i2c: bcm2835: Avoid clock stretching timeouts Input: clear BTN_RIGHT/MIDDLE on buttonpads cifs: fix double free race when mount fails in cifs_get_root() dmaengine: shdma: Fix runtime PM imbalance on error i2c: qup: allow COMPILE_TEST net: usb: cdc_mbim: avoid altsetting toggling for Telit FN990 usb: gadget: don't release an existing dev->buf usb: gadget: clear related members when goto fail ata: pata_hpt37x: fix PCI clock detection ASoC: ops: Shift tested values in snd_soc_put_volsw() by +min xfrm: fix MTU regression netfilter: nf_queue: don't assume sk is full socket netfilter: nf_queue: fix possible use-after-free net: dcb: flush lingering app table entries for unregistered devices firmware: Fix a reference count leak. firmware: qemu_fw_cfg: fix kobject leak in probe error path mac80211: fix forwarded mesh frames AC & queue selection net: stmmac: fix return value of __setup handler net: sxgbe: fix return value of __setup handler net: arcnet: com20020: Fix null-ptr-deref in com20020pci_probe() efivars: Respect "block" flag in efivar_entry_set_safe() can: gs_usb: change active_channels's type from atomic_t to u8 ARM: 9182/1: mmu: fix returns from early_param() and __setup() functions soc: fsl: qe: Check of ioremap return value net: chelsio: cxgb3: check the return value of pci_find_capability() Input: elan_i2c - move regulator_[en|dis]able() out of elan_[en|dis]able_power() Input: elan_i2c - fix regulator enable count imbalance after suspend/resume HID: add mapping for KEY_ALL_APPLICATIONS memfd: fix F_SEAL_WRITE after shmem huge page allocated net: dcb: disable softirqs in dcbnl_flush_dev() hamradio: fix macro redefine warning Linux 4.9.305 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I153e78dd376b8c593af11ccaf5ea3b6e1b0c070e
This commit is contained in:
commit
ad8bfa47c3
32 changed files with 200 additions and 86 deletions
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 304
|
||||
SUBLEVEL = 305
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
|
|
|||
|
|
@ -228,12 +228,14 @@ early_param("ecc", early_ecc);
|
|||
static int __init early_cachepolicy(char *p)
|
||||
{
|
||||
pr_warn("cachepolicy kernel parameter not supported without cp15\n");
|
||||
return 0;
|
||||
}
|
||||
early_param("cachepolicy", early_cachepolicy);
|
||||
|
||||
static int __init noalign_setup(char *__unused)
|
||||
{
|
||||
pr_warn("noalign kernel parameter not supported without cp15\n");
|
||||
return 1;
|
||||
}
|
||||
__setup("noalign", noalign_setup);
|
||||
|
||||
|
|
|
|||
|
|
@ -964,14 +964,14 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
|
||||
if ((freq >> 12) != 0xABCDE) {
|
||||
int i;
|
||||
u8 sr;
|
||||
u16 sr;
|
||||
u32 total = 0;
|
||||
|
||||
pr_warn("BIOS has not set timing clocks\n");
|
||||
|
||||
/* This is the process the HPT371 BIOS is reported to use */
|
||||
for (i = 0; i < 128; i++) {
|
||||
pci_read_config_byte(dev, 0x78, &sr);
|
||||
pci_read_config_word(dev, 0x78, &sr);
|
||||
total += sr & 0x1FF;
|
||||
udelay(15);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -118,8 +118,10 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)
|
|||
ret = pm_runtime_get(schan->dev);
|
||||
|
||||
spin_unlock_irq(&schan->chan_lock);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
dev_err(schan->dev, "%s(): GET = %d\n", __func__, ret);
|
||||
pm_runtime_put(schan->dev);
|
||||
}
|
||||
|
||||
pm_runtime_barrier(schan->dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -763,6 +763,7 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
|
|||
{
|
||||
const struct efivar_operations *ops;
|
||||
efi_status_t status;
|
||||
unsigned long varsize;
|
||||
|
||||
if (!__efivars)
|
||||
return -EINVAL;
|
||||
|
|
@ -785,15 +786,17 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
|
|||
return efivar_entry_set_nonblocking(name, vendor, attributes,
|
||||
size, data);
|
||||
|
||||
varsize = size + ucs2_strsize(name, 1024);
|
||||
if (!block) {
|
||||
if (down_trylock(&efivars_lock))
|
||||
return -EBUSY;
|
||||
status = check_var_size_nonblocking(attributes, varsize);
|
||||
} else {
|
||||
if (down_interruptible(&efivars_lock))
|
||||
return -EINTR;
|
||||
status = check_var_size(attributes, varsize);
|
||||
}
|
||||
|
||||
status = check_var_size(attributes, size + ucs2_strsize(name, 1024));
|
||||
if (status != EFI_SUCCESS) {
|
||||
up(&efivars_lock);
|
||||
return -ENOSPC;
|
||||
|
|
|
|||
|
|
@ -462,12 +462,12 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
|
|||
err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype,
|
||||
fw_cfg_sel_ko, "%d", entry->f.select);
|
||||
if (err)
|
||||
goto err_register;
|
||||
goto err_put_entry;
|
||||
|
||||
/* add raw binary content access */
|
||||
err = sysfs_create_bin_file(&entry->kobj, &fw_cfg_sysfs_attr_raw);
|
||||
if (err)
|
||||
goto err_add_raw;
|
||||
goto err_del_entry;
|
||||
|
||||
/* try adding "/sys/firmware/qemu_fw_cfg/by_name/" symlink */
|
||||
fw_cfg_build_symlink(fw_cfg_fname_kset, &entry->kobj, entry->f.name);
|
||||
|
|
@ -476,10 +476,10 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
|
|||
fw_cfg_sysfs_cache_enlist(entry);
|
||||
return 0;
|
||||
|
||||
err_add_raw:
|
||||
err_del_entry:
|
||||
kobject_del(&entry->kobj);
|
||||
err_register:
|
||||
kfree(entry);
|
||||
err_put_entry:
|
||||
kobject_put(&entry->kobj);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -833,7 +833,9 @@ static const char *keys[KEY_MAX + 1] = {
|
|||
[KEY_F22] = "F22", [KEY_F23] = "F23",
|
||||
[KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD",
|
||||
[KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3",
|
||||
[KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend",
|
||||
[KEY_PROG4] = "Prog4",
|
||||
[KEY_ALL_APPLICATIONS] = "AllApplications",
|
||||
[KEY_SUSPEND] = "Suspend",
|
||||
[KEY_CLOSE] = "Close", [KEY_PLAY] = "Play",
|
||||
[KEY_FASTFORWARD] = "FastForward", [KEY_BASSBOOST] = "BassBoost",
|
||||
[KEY_PRINT] = "Print", [KEY_HP] = "HP",
|
||||
|
|
|
|||
|
|
@ -997,6 +997,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
|||
case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
|
||||
case 0x28c: map_key_clear(KEY_SEND); break;
|
||||
|
||||
case 0x2a2: map_key_clear(KEY_ALL_APPLICATIONS); break;
|
||||
|
||||
case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV); break;
|
||||
case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT); break;
|
||||
case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP); break;
|
||||
|
|
|
|||
|
|
@ -783,7 +783,7 @@ config I2C_PXA_SLAVE
|
|||
|
||||
config I2C_QUP
|
||||
tristate "Qualcomm QUP based I2C controller"
|
||||
depends on ARCH_QCOM
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
help
|
||||
If you say yes to this option, support will be included for the
|
||||
built-in I2C interface on the Qualcomm SoCs.
|
||||
|
|
|
|||
|
|
@ -28,6 +28,11 @@
|
|||
#define BCM2835_I2C_FIFO 0x10
|
||||
#define BCM2835_I2C_DIV 0x14
|
||||
#define BCM2835_I2C_DEL 0x18
|
||||
/*
|
||||
* 16-bit field for the number of SCL cycles to wait after rising SCL
|
||||
* before deciding the slave is not responding. 0 disables the
|
||||
* timeout detection.
|
||||
*/
|
||||
#define BCM2835_I2C_CLKT 0x1c
|
||||
|
||||
#define BCM2835_I2C_C_READ BIT(0)
|
||||
|
|
@ -313,6 +318,12 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
|
|||
adap->dev.of_node = pdev->dev.of_node;
|
||||
adap->quirks = &bcm2835_i2c_quirks;
|
||||
|
||||
/*
|
||||
* Disable the hardware clock stretching timeout. SMBUS
|
||||
* specifies a limit for how long the device can stretch the
|
||||
* clock, but core I2C doesn't.
|
||||
*/
|
||||
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_CLKT, 0);
|
||||
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0);
|
||||
|
||||
ret = i2c_add_adapter(adap);
|
||||
|
|
|
|||
|
|
@ -2112,6 +2112,12 @@ int input_register_device(struct input_dev *dev)
|
|||
/* KEY_RESERVED is not supposed to be transmitted to userspace. */
|
||||
__clear_bit(KEY_RESERVED, dev->keybit);
|
||||
|
||||
/* Buttonpads should not map BTN_RIGHT and/or BTN_MIDDLE. */
|
||||
if (test_bit(INPUT_PROP_BUTTONPAD, dev->propbit)) {
|
||||
__clear_bit(BTN_RIGHT, dev->keybit);
|
||||
__clear_bit(BTN_MIDDLE, dev->keybit);
|
||||
}
|
||||
|
||||
/* Make sure that bitmasks not mentioned in dev->evbit are clean. */
|
||||
input_cleanse_bitmasks(dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -132,55 +132,21 @@ static int elan_get_fwinfo(u8 iap_version, u16 *validpage_count,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int elan_enable_power(struct elan_tp_data *data)
|
||||
static int elan_set_power(struct elan_tp_data *data, bool on)
|
||||
{
|
||||
int repeat = ETP_RETRY_COUNT;
|
||||
int error;
|
||||
|
||||
error = regulator_enable(data->vcc);
|
||||
if (error) {
|
||||
dev_err(&data->client->dev,
|
||||
"failed to enable regulator: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
do {
|
||||
error = data->ops->power_control(data->client, true);
|
||||
error = data->ops->power_control(data->client, on);
|
||||
if (error >= 0)
|
||||
return 0;
|
||||
|
||||
msleep(30);
|
||||
} while (--repeat > 0);
|
||||
|
||||
dev_err(&data->client->dev, "failed to enable power: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int elan_disable_power(struct elan_tp_data *data)
|
||||
{
|
||||
int repeat = ETP_RETRY_COUNT;
|
||||
int error;
|
||||
|
||||
do {
|
||||
error = data->ops->power_control(data->client, false);
|
||||
if (!error) {
|
||||
error = regulator_disable(data->vcc);
|
||||
if (error) {
|
||||
dev_err(&data->client->dev,
|
||||
"failed to disable regulator: %d\n",
|
||||
error);
|
||||
/* Attempt to power the chip back up */
|
||||
data->ops->power_control(data->client, true);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
msleep(30);
|
||||
} while (--repeat > 0);
|
||||
|
||||
dev_err(&data->client->dev, "failed to disable power: %d\n", error);
|
||||
dev_err(&data->client->dev, "failed to set power %s: %d\n",
|
||||
on ? "on" : "off", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
@ -1195,9 +1161,19 @@ static int __maybe_unused elan_suspend(struct device *dev)
|
|||
/* Enable wake from IRQ */
|
||||
data->irq_wake = (enable_irq_wake(client->irq) == 0);
|
||||
} else {
|
||||
ret = elan_disable_power(data);
|
||||
ret = elan_set_power(data, false);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = regulator_disable(data->vcc);
|
||||
if (ret) {
|
||||
dev_err(dev, "error %d disabling regulator\n", ret);
|
||||
/* Attempt to power the chip back up */
|
||||
elan_set_power(data, true);
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
mutex_unlock(&data->sysfs_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1208,12 +1184,18 @@ static int __maybe_unused elan_resume(struct device *dev)
|
|||
struct elan_tp_data *data = i2c_get_clientdata(client);
|
||||
int error;
|
||||
|
||||
if (device_may_wakeup(dev) && data->irq_wake) {
|
||||
if (!device_may_wakeup(dev)) {
|
||||
error = regulator_enable(data->vcc);
|
||||
if (error) {
|
||||
dev_err(dev, "error %d enabling regulator\n", error);
|
||||
goto err;
|
||||
}
|
||||
} else if (data->irq_wake) {
|
||||
disable_irq_wake(client->irq);
|
||||
data->irq_wake = false;
|
||||
}
|
||||
|
||||
error = elan_enable_power(data);
|
||||
error = elan_set_power(data, true);
|
||||
if (error) {
|
||||
dev_err(dev, "power up when resuming failed: %d\n", error);
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -115,6 +115,9 @@ static int com20020pci_probe(struct pci_dev *pdev,
|
|||
return -ENOMEM;
|
||||
|
||||
ci = (struct com20020_pci_card_info *)id->driver_data;
|
||||
if (!ci)
|
||||
return -EINVAL;
|
||||
|
||||
priv->ci = ci;
|
||||
mm = &ci->misc_map;
|
||||
|
||||
|
|
|
|||
|
|
@ -198,8 +198,8 @@ struct gs_can {
|
|||
struct gs_usb {
|
||||
struct gs_can *canch[GS_MAX_INTF];
|
||||
struct usb_anchor rx_submitted;
|
||||
atomic_t active_channels;
|
||||
struct usb_device *udev;
|
||||
u8 active_channels;
|
||||
};
|
||||
|
||||
/* 'allocate' a tx context.
|
||||
|
|
@ -597,7 +597,7 @@ static int gs_can_open(struct net_device *netdev)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (atomic_add_return(1, &parent->active_channels) == 1) {
|
||||
if (!parent->active_channels) {
|
||||
for (i = 0; i < GS_MAX_RX_URBS; i++) {
|
||||
struct urb *urb;
|
||||
u8 *buf;
|
||||
|
|
@ -698,6 +698,7 @@ static int gs_can_open(struct net_device *netdev)
|
|||
|
||||
dev->can.state = CAN_STATE_ERROR_ACTIVE;
|
||||
|
||||
parent->active_channels++;
|
||||
if (!(dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY))
|
||||
netif_start_queue(netdev);
|
||||
|
||||
|
|
@ -713,7 +714,8 @@ static int gs_can_close(struct net_device *netdev)
|
|||
netif_stop_queue(netdev);
|
||||
|
||||
/* Stop polling */
|
||||
if (atomic_dec_and_test(&parent->active_channels))
|
||||
parent->active_channels--;
|
||||
if (!parent->active_channels)
|
||||
usb_kill_anchored_urbs(&parent->rx_submitted);
|
||||
|
||||
/* Stop sending URBs */
|
||||
|
|
@ -992,8 +994,6 @@ static int gs_usb_probe(struct usb_interface *intf,
|
|||
|
||||
init_usb_anchor(&dev->rx_submitted);
|
||||
|
||||
atomic_set(&dev->active_channels, 0);
|
||||
|
||||
usb_set_intfdata(intf, dev);
|
||||
dev->udev = interface_to_usbdev(intf);
|
||||
|
||||
|
|
|
|||
|
|
@ -3677,6 +3677,8 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
|
|||
MAC_STATS_ACCUM_SECS : (MAC_STATS_ACCUM_SECS * 10);
|
||||
adapter->params.pci.vpd_cap_addr =
|
||||
pci_find_capability(adapter->pdev, PCI_CAP_ID_VPD);
|
||||
if (!adapter->params.pci.vpd_cap_addr)
|
||||
return -ENODEV;
|
||||
ret = get_vpd_params(adapter, &adapter->params.vpd);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -2311,18 +2311,18 @@ static int __init sxgbe_cmdline_opt(char *str)
|
|||
char *opt;
|
||||
|
||||
if (!str || !*str)
|
||||
return -EINVAL;
|
||||
return 1;
|
||||
while ((opt = strsep(&str, ",")) != NULL) {
|
||||
if (!strncmp(opt, "eee_timer:", 10)) {
|
||||
if (kstrtoint(opt + 10, 0, &eee_timer))
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return 1;
|
||||
|
||||
err:
|
||||
pr_err("%s: ERROR broken module parameter conversion\n", __func__);
|
||||
return -EINVAL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("sxgbeeth=", sxgbe_cmdline_opt);
|
||||
|
|
|
|||
|
|
@ -3608,7 +3608,7 @@ static int __init stmmac_cmdline_opt(char *str)
|
|||
char *opt;
|
||||
|
||||
if (!str || !*str)
|
||||
return -EINVAL;
|
||||
return 1;
|
||||
while ((opt = strsep(&str, ",")) != NULL) {
|
||||
if (!strncmp(opt, "debug:", 6)) {
|
||||
if (kstrtoint(opt + 6, 0, &debug))
|
||||
|
|
@ -3639,11 +3639,11 @@ static int __init stmmac_cmdline_opt(char *str)
|
|||
goto err;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return 1;
|
||||
|
||||
err:
|
||||
pr_err("%s: ERROR broken module parameter conversion", __func__);
|
||||
return -EINVAL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("stmmaceth=", stmmac_cmdline_opt);
|
||||
|
|
|
|||
|
|
@ -41,6 +41,8 @@
|
|||
|
||||
#define AX_MTU 236
|
||||
|
||||
/* some arch define END as assembly function ending, just undef it */
|
||||
#undef END
|
||||
/* SLIP/KISS protocol characters. */
|
||||
#define END 0300 /* indicates end of frame */
|
||||
#define ESC 0333 /* indicates byte stuffing */
|
||||
|
|
|
|||
|
|
@ -652,6 +652,11 @@ static const struct usb_device_id mbim_devs[] = {
|
|||
.driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
|
||||
},
|
||||
|
||||
/* Telit FN990 */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1071, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
|
||||
},
|
||||
|
||||
/* default entry */
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info_zlp,
|
||||
|
|
|
|||
|
|
@ -1987,6 +1987,15 @@ static void hw_scan_work(struct work_struct *work)
|
|||
memcpy(skb_put(probe, req->ie_len), req->ie,
|
||||
req->ie_len);
|
||||
|
||||
if (!ieee80211_tx_prepare_skb(hwsim->hw,
|
||||
hwsim->hw_scan_vif,
|
||||
probe,
|
||||
hwsim->tmp_chan->band,
|
||||
NULL)) {
|
||||
kfree_skb(probe);
|
||||
continue;
|
||||
}
|
||||
|
||||
local_bh_disable();
|
||||
mac80211_hwsim_tx_frame(hwsim->hw, probe,
|
||||
hwsim->tmp_chan);
|
||||
|
|
@ -2919,6 +2928,10 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2,
|
|||
}
|
||||
txi->flags |= IEEE80211_TX_STAT_ACK;
|
||||
}
|
||||
|
||||
if (hwsim_flags & HWSIM_TX_CTL_NO_ACK)
|
||||
txi->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
|
||||
|
||||
ieee80211_tx_status_irqsafe(data2->hw, skb);
|
||||
return 0;
|
||||
out:
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue