Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/usb/qmi_wwan.c net/batman-adv/translation-table.c net/ipv6/route.c qmi_wwan.c resolution provided by Bjørn Mork. batman-adv conflict is dealing merely with the changes of global function names to have a proper subsystem prefix. ipv6's route.c conflict is merely two side-by-side additions of network namespace methods. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e486463e82
47 changed files with 306 additions and 205 deletions
|
@ -63,6 +63,7 @@ static struct usb_device_id ath3k_table[] = {
|
|||
|
||||
/* Atheros AR3011 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0CF3, 0x3002) },
|
||||
{ USB_DEVICE(0x0CF3, 0xE019) },
|
||||
{ USB_DEVICE(0x13d3, 0x3304) },
|
||||
{ USB_DEVICE(0x0930, 0x0215) },
|
||||
{ USB_DEVICE(0x0489, 0xE03D) },
|
||||
|
@ -77,6 +78,7 @@ static struct usb_device_id ath3k_table[] = {
|
|||
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||
{ USB_DEVICE(0x13d3, 0x3362) },
|
||||
{ USB_DEVICE(0x0CF3, 0xE004) },
|
||||
{ USB_DEVICE(0x0930, 0x0219) },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||
|
@ -101,6 +103,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
|||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU22 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
||||
|
|
|
@ -136,7 +136,7 @@ int btmrvl_remove_card(struct btmrvl_private *priv);
|
|||
|
||||
void btmrvl_interrupt(struct btmrvl_private *priv);
|
||||
|
||||
void btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||
bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||
int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||
|
||||
int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd);
|
||||
|
|
|
@ -44,23 +44,33 @@ void btmrvl_interrupt(struct btmrvl_private *priv)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(btmrvl_interrupt);
|
||||
|
||||
void btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
|
||||
bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
|
||||
{
|
||||
struct hci_event_hdr *hdr = (void *) skb->data;
|
||||
struct hci_ev_cmd_complete *ec;
|
||||
u16 opcode, ocf;
|
||||
u16 opcode, ocf, ogf;
|
||||
|
||||
if (hdr->evt == HCI_EV_CMD_COMPLETE) {
|
||||
ec = (void *) (skb->data + HCI_EVENT_HDR_SIZE);
|
||||
opcode = __le16_to_cpu(ec->opcode);
|
||||
ocf = hci_opcode_ocf(opcode);
|
||||
ogf = hci_opcode_ogf(opcode);
|
||||
|
||||
if (ocf == BT_CMD_MODULE_CFG_REQ &&
|
||||
priv->btmrvl_dev.sendcmdflag) {
|
||||
priv->btmrvl_dev.sendcmdflag = false;
|
||||
priv->adapter->cmd_complete = true;
|
||||
wake_up_interruptible(&priv->adapter->cmd_wait_q);
|
||||
}
|
||||
|
||||
if (ogf == OGF) {
|
||||
BT_DBG("vendor event skipped: ogf 0x%4.4x", ogf);
|
||||
kfree_skb(skb);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(btmrvl_check_evtpkt);
|
||||
|
||||
|
|
|
@ -565,10 +565,12 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
|
|||
skb_put(skb, buf_len);
|
||||
skb_pull(skb, SDIO_HEADER_LEN);
|
||||
|
||||
if (type == HCI_EVENT_PKT)
|
||||
btmrvl_check_evtpkt(priv, skb);
|
||||
if (type == HCI_EVENT_PKT) {
|
||||
if (btmrvl_check_evtpkt(priv, skb))
|
||||
hci_recv_frame(skb);
|
||||
} else
|
||||
hci_recv_frame(skb);
|
||||
|
||||
hci_recv_frame(skb);
|
||||
hdev->stat.byte_rx += buf_len;
|
||||
break;
|
||||
|
||||
|
|
|
@ -117,6 +117,7 @@ static struct usb_device_id blacklist_table[] = {
|
|||
|
||||
/* Atheros 3011 with sflash firmware */
|
||||
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
|
||||
{ USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
|
||||
|
@ -131,6 +132,7 @@ static struct usb_device_id blacklist_table[] = {
|
|||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||
|
|
|
@ -150,14 +150,25 @@ static void bond_info_show_master(struct seq_file *seq)
|
|||
}
|
||||
}
|
||||
|
||||
static const char *bond_slave_link_status(s8 link)
|
||||
{
|
||||
static const char * const status[] = {
|
||||
[BOND_LINK_UP] = "up",
|
||||
[BOND_LINK_FAIL] = "going down",
|
||||
[BOND_LINK_DOWN] = "down",
|
||||
[BOND_LINK_BACK] = "going back",
|
||||
};
|
||||
|
||||
return status[link];
|
||||
}
|
||||
|
||||
static void bond_info_show_slave(struct seq_file *seq,
|
||||
const struct slave *slave)
|
||||
{
|
||||
struct bonding *bond = seq->private;
|
||||
|
||||
seq_printf(seq, "\nSlave Interface: %s\n", slave->dev->name);
|
||||
seq_printf(seq, "MII Status: %s\n",
|
||||
(slave->link == BOND_LINK_UP) ? "up" : "down");
|
||||
seq_printf(seq, "MII Status: %s\n", bond_slave_link_status(slave->link));
|
||||
if (slave->speed == SPEED_UNKNOWN)
|
||||
seq_printf(seq, "Speed: %s\n", "Unknown");
|
||||
else
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#define I2C_BSC0 0
|
||||
#define I2C_BSC1 1
|
||||
#define I2C_WA_RETRY_CNT 3
|
||||
#define I2C_WA_PWR_ITER (I2C_WA_RETRY_CNT - 1)
|
||||
#define MCPR_IMC_COMMAND_READ_OP 1
|
||||
#define MCPR_IMC_COMMAND_WRITE_OP 2
|
||||
|
||||
|
@ -7754,6 +7755,28 @@ static int bnx2x_8726_read_sfp_module_eeprom(struct bnx2x_phy *phy,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void bnx2x_warpcore_power_module(struct link_params *params,
|
||||
struct bnx2x_phy *phy,
|
||||
u8 power)
|
||||
{
|
||||
u32 pin_cfg;
|
||||
struct bnx2x *bp = params->bp;
|
||||
|
||||
pin_cfg = (REG_RD(bp, params->shmem_base +
|
||||
offsetof(struct shmem_region,
|
||||
dev_info.port_hw_config[params->port].e3_sfp_ctrl)) &
|
||||
PORT_HW_CFG_E3_PWR_DIS_MASK) >>
|
||||
PORT_HW_CFG_E3_PWR_DIS_SHIFT;
|
||||
|
||||
if (pin_cfg == PIN_CFG_NA)
|
||||
return;
|
||||
DP(NETIF_MSG_LINK, "Setting SFP+ module power to %d using pin cfg %d\n",
|
||||
power, pin_cfg);
|
||||
/* Low ==> corresponding SFP+ module is powered
|
||||
* high ==> the SFP+ module is powered down
|
||||
*/
|
||||
bnx2x_set_cfg_pin(bp, pin_cfg, power ^ 1);
|
||||
}
|
||||
static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
|
||||
struct link_params *params,
|
||||
u16 addr, u8 byte_cnt,
|
||||
|
@ -7774,6 +7797,12 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
|
|||
/* 4 byte aligned address */
|
||||
addr32 = addr & (~0x3);
|
||||
do {
|
||||
if (cnt == I2C_WA_PWR_ITER) {
|
||||
bnx2x_warpcore_power_module(params, phy, 0);
|
||||
/* Note that 100us are not enough here */
|
||||
usleep_range(1000,1000);
|
||||
bnx2x_warpcore_power_module(params, phy, 1);
|
||||
}
|
||||
rc = bnx2x_bsc_read(params, phy, 0xa0, addr32, 0, byte_cnt,
|
||||
data_array);
|
||||
} while ((rc != 0) && (++cnt < I2C_WA_RETRY_CNT));
|
||||
|
@ -8312,29 +8341,6 @@ static void bnx2x_set_sfp_module_fault_led(struct link_params *params,
|
|||
bnx2x_set_e1e2_module_fault_led(params, gpio_mode);
|
||||
}
|
||||
|
||||
static void bnx2x_warpcore_power_module(struct link_params *params,
|
||||
struct bnx2x_phy *phy,
|
||||
u8 power)
|
||||
{
|
||||
u32 pin_cfg;
|
||||
struct bnx2x *bp = params->bp;
|
||||
|
||||
pin_cfg = (REG_RD(bp, params->shmem_base +
|
||||
offsetof(struct shmem_region,
|
||||
dev_info.port_hw_config[params->port].e3_sfp_ctrl)) &
|
||||
PORT_HW_CFG_E3_PWR_DIS_MASK) >>
|
||||
PORT_HW_CFG_E3_PWR_DIS_SHIFT;
|
||||
|
||||
if (pin_cfg == PIN_CFG_NA)
|
||||
return;
|
||||
DP(NETIF_MSG_LINK, "Setting SFP+ module power to %d using pin cfg %d\n",
|
||||
power, pin_cfg);
|
||||
/* Low ==> corresponding SFP+ module is powered
|
||||
* high ==> the SFP+ module is powered down
|
||||
*/
|
||||
bnx2x_set_cfg_pin(bp, pin_cfg, power ^ 1);
|
||||
}
|
||||
|
||||
static void bnx2x_warpcore_hw_reset(struct bnx2x_phy *phy,
|
||||
struct link_params *params)
|
||||
{
|
||||
|
@ -9980,7 +9986,7 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,
|
|||
|
||||
usleep_range(1000, 2000);
|
||||
|
||||
if (!(CHIP_IS_E1(bp)))
|
||||
if (!(CHIP_IS_E1x(bp)))
|
||||
port = BP_PATH(bp);
|
||||
else
|
||||
port = params->port;
|
||||
|
|
|
@ -122,15 +122,15 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
|
|||
goto done;
|
||||
|
||||
if (compl_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
|
||||
dev_warn(&adapter->pdev->dev, "This domain(VM) is not "
|
||||
"permitted to execute this cmd (opcode %d)\n",
|
||||
opcode);
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"opcode %d-%d is not permitted\n",
|
||||
opcode, subsystem);
|
||||
} else {
|
||||
extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) &
|
||||
CQE_STATUS_EXTD_MASK;
|
||||
dev_err(&adapter->pdev->dev, "Cmd (opcode %d) failed:"
|
||||
"status %d, extd-status %d\n",
|
||||
opcode, compl_status, extd_status);
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"opcode %d-%d failed:status %d-%d\n",
|
||||
opcode, subsystem, compl_status, extd_status);
|
||||
}
|
||||
}
|
||||
done:
|
||||
|
|
|
@ -1566,7 +1566,7 @@ struct be_hw_stats_v1 {
|
|||
u32 rsvd0[BE_TXP_SW_SZ];
|
||||
struct be_erx_stats_v1 erx;
|
||||
struct be_pmem_stats pmem;
|
||||
u32 rsvd1[3];
|
||||
u32 rsvd1[18];
|
||||
};
|
||||
|
||||
struct be_cmd_req_get_stats_v1 {
|
||||
|
|
|
@ -3242,7 +3242,7 @@ static void be_netdev_init(struct net_device *netdev)
|
|||
|
||||
netdev->flags |= IFF_MULTICAST;
|
||||
|
||||
netif_set_gso_max_size(netdev, 65535);
|
||||
netif_set_gso_max_size(netdev, 65535 - ETH_HLEN);
|
||||
|
||||
netdev->netdev_ops = &be_netdev_ops;
|
||||
|
||||
|
|
|
@ -122,8 +122,10 @@ config IGB_DCA
|
|||
|
||||
config IGB_PTP
|
||||
bool "PTP Hardware Clock (PHC)"
|
||||
default y
|
||||
depends on IGB && PTP_1588_CLOCK
|
||||
default n
|
||||
depends on IGB && EXPERIMENTAL
|
||||
select PPS
|
||||
select PTP_1588_CLOCK
|
||||
---help---
|
||||
Say Y here if you want to use PTP Hardware Clock (PHC) in the
|
||||
driver. Only the basic clock operations have been implemented.
|
||||
|
@ -223,7 +225,9 @@ config IXGBE_DCB
|
|||
config IXGBE_PTP
|
||||
bool "PTP Clock Support"
|
||||
default n
|
||||
depends on IXGBE && PTP_1588_CLOCK
|
||||
depends on IXGBE && EXPERIMENTAL
|
||||
select PPS
|
||||
select PTP_1588_CLOCK
|
||||
---help---
|
||||
Say Y here if you want support for 1588 Timestamping with a
|
||||
PHC device, using the PTP 1588 Clock support. This is
|
||||
|
|
|
@ -206,8 +206,6 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
|
|||
mac->rar_entry_count = E1000_RAR_ENTRIES_82580;
|
||||
break;
|
||||
case e1000_i350:
|
||||
case e1000_i210:
|
||||
case e1000_i211:
|
||||
mac->rar_entry_count = E1000_RAR_ENTRIES_I350;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -1146,7 +1146,7 @@ static bool ixgbe_alloc_mapped_page(struct ixgbe_ring *rx_ring,
|
|||
|
||||
/* alloc new page for storage */
|
||||
if (likely(!page)) {
|
||||
page = alloc_pages(GFP_ATOMIC | __GFP_COLD,
|
||||
page = alloc_pages(GFP_ATOMIC | __GFP_COLD | __GFP_COMP,
|
||||
ixgbe_rx_pg_order(rx_ring));
|
||||
if (unlikely(!page)) {
|
||||
rx_ring->rx_stats.alloc_rx_page_failed++;
|
||||
|
|
|
@ -787,6 +787,7 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
|
|||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u32 incval = 0;
|
||||
u32 timinca = 0;
|
||||
u32 shift = 0;
|
||||
u32 cycle_speed;
|
||||
unsigned long flags;
|
||||
|
@ -809,8 +810,16 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
|
|||
break;
|
||||
}
|
||||
|
||||
/* Bail if the cycle speed didn't change */
|
||||
if (adapter->cycle_speed == cycle_speed)
|
||||
/*
|
||||
* grab the current TIMINCA value from the register so that it can be
|
||||
* double checked. If the register value has been cleared, it must be
|
||||
* reset to the correct value for generating a cyclecounter. If
|
||||
* TIMINCA is zero, the SYSTIME registers do not increment at all.
|
||||
*/
|
||||
timinca = IXGBE_READ_REG(hw, IXGBE_TIMINCA);
|
||||
|
||||
/* Bail if the cycle speed didn't change and TIMINCA is non-zero */
|
||||
if (adapter->cycle_speed == cycle_speed && timinca)
|
||||
return;
|
||||
|
||||
/* disable the SDP clock out */
|
||||
|
|
|
@ -3894,6 +3894,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)
|
|||
case RTL_GIGA_MAC_VER_22:
|
||||
case RTL_GIGA_MAC_VER_23:
|
||||
case RTL_GIGA_MAC_VER_24:
|
||||
case RTL_GIGA_MAC_VER_34:
|
||||
RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -1011,7 +1011,7 @@ static int sh_eth_txfree(struct net_device *ndev)
|
|||
}
|
||||
|
||||
/* Packet receive function */
|
||||
static int sh_eth_rx(struct net_device *ndev)
|
||||
static int sh_eth_rx(struct net_device *ndev, u32 intr_status)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
struct sh_eth_rxdesc *rxdesc;
|
||||
|
@ -1102,9 +1102,11 @@ static int sh_eth_rx(struct net_device *ndev)
|
|||
/* Restart Rx engine if stopped. */
|
||||
/* If we don't need to check status, don't. -KDU */
|
||||
if (!(sh_eth_read(ndev, EDRRR) & EDRRR_R)) {
|
||||
/* fix the values for the next receiving */
|
||||
mdp->cur_rx = mdp->dirty_rx = (sh_eth_read(ndev, RDFAR) -
|
||||
sh_eth_read(ndev, RDLAR)) >> 4;
|
||||
/* fix the values for the next receiving if RDE is set */
|
||||
if (intr_status & EESR_RDE)
|
||||
mdp->cur_rx = mdp->dirty_rx =
|
||||
(sh_eth_read(ndev, RDFAR) -
|
||||
sh_eth_read(ndev, RDLAR)) >> 4;
|
||||
sh_eth_write(ndev, EDRRR_R, EDRRR);
|
||||
}
|
||||
|
||||
|
@ -1273,7 +1275,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
|
|||
EESR_RTSF | /* short frame recv */
|
||||
EESR_PRE | /* PHY-LSI recv error */
|
||||
EESR_CERF)){ /* recv frame CRC error */
|
||||
sh_eth_rx(ndev);
|
||||
sh_eth_rx(ndev, intr_status);
|
||||
}
|
||||
|
||||
/* Tx Check */
|
||||
|
|
|
@ -161,7 +161,7 @@ static struct phy_driver ks8051_driver = {
|
|||
static struct phy_driver ks8001_driver = {
|
||||
.phy_id = PHY_ID_KS8001,
|
||||
.name = "Micrel KS8001 or KS8721",
|
||||
.phy_id_mask = 0x00fffff0,
|
||||
.phy_id_mask = 0x00ffffff,
|
||||
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause),
|
||||
.flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT,
|
||||
.config_init = kszphy_config_init,
|
||||
|
@ -174,7 +174,7 @@ static struct phy_driver ks8001_driver = {
|
|||
|
||||
static struct phy_driver ksz9021_driver = {
|
||||
.phy_id = PHY_ID_KSZ9021,
|
||||
.phy_id_mask = 0x000fff10,
|
||||
.phy_id_mask = 0x000ffffe,
|
||||
.name = "Micrel KSZ9021 Gigabit PHY",
|
||||
.features = (PHY_GBIT_FEATURES | SUPPORTED_Pause
|
||||
| SUPPORTED_Asym_Pause),
|
||||
|
@ -240,8 +240,8 @@ MODULE_AUTHOR("David J. Choi");
|
|||
MODULE_LICENSE("GPL");
|
||||
|
||||
static struct mdio_device_id __maybe_unused micrel_tbl[] = {
|
||||
{ PHY_ID_KSZ9021, 0x000fff10 },
|
||||
{ PHY_ID_KS8001, 0x00fffff0 },
|
||||
{ PHY_ID_KSZ9021, 0x000ffffe },
|
||||
{ PHY_ID_KS8001, 0x00ffffff },
|
||||
{ PHY_ID_KS8737, 0x00fffff0 },
|
||||
{ PHY_ID_KS8041, 0x00fffff0 },
|
||||
{ PHY_ID_KS8051, 0x00fffff0 },
|
||||
|
|
|
@ -269,29 +269,6 @@ static int qmi_wwan_bind_shared(struct usbnet *dev, struct usb_interface *intf)
|
|||
return rv;
|
||||
}
|
||||
|
||||
/* Gobi devices uses identical class/protocol codes for all interfaces regardless
|
||||
* of function. Some of these are CDC ACM like and have the exact same endpoints
|
||||
* we are looking for. This leaves two possible strategies for identifying the
|
||||
* correct interface:
|
||||
* a) hardcoding interface number, or
|
||||
* b) use the fact that the wwan interface is the only one lacking additional
|
||||
* (CDC functional) descriptors
|
||||
*
|
||||
* Let's see if we can get away with the generic b) solution.
|
||||
*/
|
||||
static int qmi_wwan_bind_gobi(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
int rv = -EINVAL;
|
||||
|
||||
/* ignore any interface with additional descriptors */
|
||||
if (intf->cur_altsetting->extralen)
|
||||
goto err;
|
||||
|
||||
rv = qmi_wwan_bind_shared(dev, intf);
|
||||
err:
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void qmi_wwan_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
struct qmi_wwan_state *info = (void *)&dev->data;
|
||||
|
@ -375,15 +352,15 @@ static const struct driver_info qmi_wwan_shared = {
|
|||
.manage_power = qmi_wwan_manage_power,
|
||||
};
|
||||
|
||||
static const struct driver_info qmi_wwan_gobi = {
|
||||
.description = "Qualcomm Gobi wwan/QMI device",
|
||||
static const struct driver_info qmi_wwan_force_int0 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = qmi_wwan_bind_gobi,
|
||||
.bind = qmi_wwan_bind_shared,
|
||||
.unbind = qmi_wwan_unbind,
|
||||
.manage_power = qmi_wwan_manage_power,
|
||||
.data = BIT(0), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
/* ZTE suck at making USB descriptors */
|
||||
static const struct driver_info qmi_wwan_force_int1 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
|
@ -393,6 +370,15 @@ static const struct driver_info qmi_wwan_force_int1 = {
|
|||
.data = BIT(1), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
static const struct driver_info qmi_wwan_force_int3 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = qmi_wwan_bind_shared,
|
||||
.unbind = qmi_wwan_unbind,
|
||||
.manage_power = qmi_wwan_manage_power,
|
||||
.data = BIT(3), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
static const struct driver_info qmi_wwan_force_int4 = {
|
||||
.description = "Qualcomm WWAN/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
|
@ -418,16 +404,23 @@ static const struct driver_info qmi_wwan_force_int4 = {
|
|||
static const struct driver_info qmi_wwan_sierra = {
|
||||
.description = "Sierra Wireless wwan/QMI device",
|
||||
.flags = FLAG_WWAN,
|
||||
.bind = qmi_wwan_bind_gobi,
|
||||
.bind = qmi_wwan_bind_shared,
|
||||
.unbind = qmi_wwan_unbind,
|
||||
.manage_power = qmi_wwan_manage_power,
|
||||
.data = BIT(8) | BIT(19), /* interface whitelist bitmap */
|
||||
};
|
||||
|
||||
#define HUAWEI_VENDOR_ID 0x12D1
|
||||
|
||||
/* Gobi 1000 QMI/wwan interface number is 3 according to qcserial */
|
||||
#define QMI_GOBI1K_DEVICE(vend, prod) \
|
||||
USB_DEVICE(vend, prod), \
|
||||
.driver_info = (unsigned long)&qmi_wwan_force_int3
|
||||
|
||||
/* Gobi 2000 and Gobi 3000 QMI/wwan interface number is 0 according to qcserial */
|
||||
#define QMI_GOBI_DEVICE(vend, prod) \
|
||||
USB_DEVICE(vend, prod), \
|
||||
.driver_info = (unsigned long)&qmi_wwan_gobi
|
||||
.driver_info = (unsigned long)&qmi_wwan_force_int0
|
||||
|
||||
static const struct usb_device_id products[] = {
|
||||
{ /* Huawei E392, E398 and possibly others sharing both device id and more... */
|
||||
|
@ -538,20 +531,24 @@ static const struct usb_device_id products[] = {
|
|||
.bInterfaceProtocol = 0xff,
|
||||
.driver_info = (unsigned long)&qmi_wwan_sierra,
|
||||
},
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
||||
{QMI_GOBI_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */
|
||||
{QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */
|
||||
{QMI_GOBI_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */
|
||||
|
||||
/* Gobi 1000 devices */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
||||
{QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */
|
||||
{QMI_GOBI1K_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */
|
||||
{QMI_GOBI1K_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */
|
||||
|
||||
/* Gobi 2000 and 3000 devices */
|
||||
{QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */
|
||||
{QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */
|
||||
|
|
|
@ -793,11 +793,13 @@ int usbnet_open (struct net_device *net)
|
|||
if (info->manage_power) {
|
||||
retval = info->manage_power(dev, 1);
|
||||
if (retval < 0)
|
||||
goto done;
|
||||
goto done_manage_power_error;
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
}
|
||||
return retval;
|
||||
|
||||
done_manage_power_error:
|
||||
clear_bit(EVENT_DEV_OPEN, &dev->flags);
|
||||
done:
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
done_nopm:
|
||||
|
@ -873,9 +875,9 @@ void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info)
|
|||
{
|
||||
struct usbnet *dev = netdev_priv(net);
|
||||
|
||||
strncpy (info->driver, dev->driver_name, sizeof info->driver);
|
||||
strncpy (info->version, DRIVER_VERSION, sizeof info->version);
|
||||
strncpy (info->fw_version, dev->driver_info->description,
|
||||
strlcpy (info->driver, dev->driver_name, sizeof info->driver);
|
||||
strlcpy (info->version, DRIVER_VERSION, sizeof info->version);
|
||||
strlcpy (info->fw_version, dev->driver_info->description,
|
||||
sizeof info->fw_version);
|
||||
usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info);
|
||||
}
|
||||
|
@ -1199,6 +1201,21 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(usbnet_start_xmit);
|
||||
|
||||
static void rx_alloc_submit(struct usbnet *dev, gfp_t flags)
|
||||
{
|
||||
struct urb *urb;
|
||||
int i;
|
||||
|
||||
/* don't refill the queue all at once */
|
||||
for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) {
|
||||
urb = usb_alloc_urb(0, flags);
|
||||
if (urb != NULL) {
|
||||
if (rx_submit(dev, urb, flags) == -ENOLINK)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
// tasklet (work deferred from completions, in_irq) or timer
|
||||
|
@ -1238,26 +1255,14 @@ static void usbnet_bh (unsigned long param)
|
|||
!timer_pending (&dev->delay) &&
|
||||
!test_bit (EVENT_RX_HALT, &dev->flags)) {
|
||||
int temp = dev->rxq.qlen;
|
||||
int qlen = RX_QLEN (dev);
|
||||
|
||||
if (temp < qlen) {
|
||||
struct urb *urb;
|
||||
int i;
|
||||
|
||||
// don't refill the queue all at once
|
||||
for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) {
|
||||
urb = usb_alloc_urb (0, GFP_ATOMIC);
|
||||
if (urb != NULL) {
|
||||
if (rx_submit (dev, urb, GFP_ATOMIC) ==
|
||||
-ENOLINK)
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (temp < RX_QLEN(dev)) {
|
||||
rx_alloc_submit(dev, GFP_ATOMIC);
|
||||
if (temp != dev->rxq.qlen)
|
||||
netif_dbg(dev, link, dev->net,
|
||||
"rxqlen %d --> %d\n",
|
||||
temp, dev->rxq.qlen);
|
||||
if (dev->rxq.qlen < qlen)
|
||||
if (dev->rxq.qlen < RX_QLEN(dev))
|
||||
tasklet_schedule (&dev->bh);
|
||||
}
|
||||
if (dev->txq.qlen < TX_QLEN (dev))
|
||||
|
@ -1506,6 +1511,7 @@ int usbnet_suspend (struct usb_interface *intf, pm_message_t message)
|
|||
spin_lock_irq(&dev->txq.lock);
|
||||
/* don't autosuspend while transmitting */
|
||||
if (dev->txq.qlen && PMSG_IS_AUTO(message)) {
|
||||
dev->suspend_count--;
|
||||
spin_unlock_irq(&dev->txq.lock);
|
||||
return -EBUSY;
|
||||
} else {
|
||||
|
@ -1562,6 +1568,13 @@ int usbnet_resume (struct usb_interface *intf)
|
|||
spin_unlock_irq(&dev->txq.lock);
|
||||
|
||||
if (test_bit(EVENT_DEV_OPEN, &dev->flags)) {
|
||||
/* handle remote wakeup ASAP */
|
||||
if (!dev->wait &&
|
||||
netif_device_present(dev->net) &&
|
||||
!timer_pending(&dev->delay) &&
|
||||
!test_bit(EVENT_RX_HALT, &dev->flags))
|
||||
rx_alloc_submit(dev, GFP_KERNEL);
|
||||
|
||||
if (!(dev->txq.qlen >= TX_QLEN(dev)))
|
||||
netif_tx_wake_all_queues(dev->net);
|
||||
tasklet_schedule (&dev->bh);
|
||||
|
|
|
@ -7233,8 +7233,8 @@ static int airo_get_aplist(struct net_device *dev,
|
|||
}
|
||||
} else {
|
||||
dwrq->flags = 1; /* Should be define'd */
|
||||
memcpy(extra + sizeof(struct sockaddr)*i,
|
||||
&qual, sizeof(struct iw_quality)*i);
|
||||
memcpy(extra + sizeof(struct sockaddr) * i, qual,
|
||||
sizeof(struct iw_quality) * i);
|
||||
}
|
||||
dwrq->length = i;
|
||||
|
||||
|
|
|
@ -1045,11 +1045,11 @@ ath5k_drain_tx_buffs(struct ath5k_hw *ah)
|
|||
|
||||
ath5k_txbuf_free_skb(ah, bf);
|
||||
|
||||
spin_lock_bh(&ah->txbuflock);
|
||||
spin_lock(&ah->txbuflock);
|
||||
list_move_tail(&bf->list, &ah->txbuf);
|
||||
ah->txbuf_len++;
|
||||
txq->txq_len--;
|
||||
spin_unlock_bh(&ah->txbuflock);
|
||||
spin_unlock(&ah->txbuflock);
|
||||
}
|
||||
txq->link = NULL;
|
||||
txq->txq_poll_mark = false;
|
||||
|
|
|
@ -214,6 +214,7 @@ struct ath_frame_info {
|
|||
enum ath9k_key_type keytype;
|
||||
u8 keyix;
|
||||
u8 retries;
|
||||
u8 rtscts_rate;
|
||||
};
|
||||
|
||||
struct ath_buf_state {
|
||||
|
|
|
@ -1496,6 +1496,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
|
|||
priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--;
|
||||
|
||||
if (priv->ah->opmode == NL80211_IFTYPE_STATION) {
|
||||
ath9k_htc_choose_set_bssid(priv);
|
||||
if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1))
|
||||
ath9k_htc_start_ani(priv);
|
||||
else if (priv->num_sta_assoc_vif == 0)
|
||||
|
@ -1503,13 +1504,11 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
|
|||
}
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
if (changed & BSS_CHANGED_IBSS) {
|
||||
if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
common->curaid = bss_conf->aid;
|
||||
memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
|
||||
ath9k_htc_set_bssid(priv);
|
||||
} else if (priv->ah->opmode == NL80211_IFTYPE_STATION) {
|
||||
ath9k_htc_choose_set_bssid(priv);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -773,13 +773,25 @@ static void ath9k_hw_init_qos(struct ath_hw *ah)
|
|||
|
||||
u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
int i = 0;
|
||||
|
||||
REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
|
||||
udelay(100);
|
||||
REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
|
||||
|
||||
while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0)
|
||||
while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) {
|
||||
|
||||
udelay(100);
|
||||
|
||||
if (WARN_ON_ONCE(i >= 100)) {
|
||||
ath_err(common, "PLL4 meaurement not done\n");
|
||||
break;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;
|
||||
}
|
||||
EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc);
|
||||
|
|
|
@ -938,6 +938,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
|||
struct ieee80211_tx_rate *rates;
|
||||
const struct ieee80211_rate *rate;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu);
|
||||
int i;
|
||||
u8 rix = 0;
|
||||
|
||||
|
@ -948,18 +949,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
|||
|
||||
/* set dur_update_en for l-sig computation except for PS-Poll frames */
|
||||
info->dur_update = !ieee80211_is_pspoll(hdr->frame_control);
|
||||
|
||||
/*
|
||||
* We check if Short Preamble is needed for the CTS rate by
|
||||
* checking the BSS's global flag.
|
||||
* But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
|
||||
*/
|
||||
rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info);
|
||||
info->rtscts_rate = rate->hw_value;
|
||||
|
||||
if (tx_info->control.vif &&
|
||||
tx_info->control.vif->bss_conf.use_short_preamble)
|
||||
info->rtscts_rate |= rate->hw_value_short;
|
||||
info->rtscts_rate = fi->rtscts_rate;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
bool is_40, is_sgi, is_sp;
|
||||
|
@ -1001,13 +991,13 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
|||
}
|
||||
|
||||
/* legacy rates */
|
||||
rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
|
||||
if ((tx_info->band == IEEE80211_BAND_2GHZ) &&
|
||||
!(rate->flags & IEEE80211_RATE_ERP_G))
|
||||
phy = WLAN_RC_PHY_CCK;
|
||||
else
|
||||
phy = WLAN_RC_PHY_OFDM;
|
||||
|
||||
rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
|
||||
info->rates[i].Rate = rate->hw_value;
|
||||
if (rate->hw_value_short) {
|
||||
if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
|
||||
|
@ -1776,10 +1766,22 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|||
struct ieee80211_sta *sta = tx_info->control.sta;
|
||||
struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
const struct ieee80211_rate *rate;
|
||||
struct ath_frame_info *fi = get_frame_info(skb);
|
||||
struct ath_node *an = NULL;
|
||||
enum ath9k_key_type keytype;
|
||||
bool short_preamble = false;
|
||||
|
||||
/*
|
||||
* We check if Short Preamble is needed for the CTS rate by
|
||||
* checking the BSS's global flag.
|
||||
* But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
|
||||
*/
|
||||
if (tx_info->control.vif &&
|
||||
tx_info->control.vif->bss_conf.use_short_preamble)
|
||||
short_preamble = true;
|
||||
|
||||
rate = ieee80211_get_rts_cts_rate(hw, tx_info);
|
||||
keytype = ath9k_cmn_get_hw_crypto_keytype(skb);
|
||||
|
||||
if (sta)
|
||||
|
@ -1794,6 +1796,9 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|||
fi->keyix = ATH9K_TXKEYIX_INVALID;
|
||||
fi->keytype = keytype;
|
||||
fi->framelen = framelen;
|
||||
fi->rtscts_rate = rate->hw_value;
|
||||
if (short_preamble)
|
||||
fi->rtscts_rate |= rate->hw_value_short;
|
||||
}
|
||||
|
||||
u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)
|
||||
|
|
|
@ -2228,6 +2228,7 @@ static ssize_t iwl_dbgfs_echo_test_write(struct file *file,
|
|||
return count;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
static ssize_t iwl_dbgfs_log_event_read(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
|
@ -2265,6 +2266,7 @@ static ssize_t iwl_dbgfs_log_event_write(struct file *file,
|
|||
|
||||
return count;
|
||||
}
|
||||
#endif
|
||||
|
||||
static ssize_t iwl_dbgfs_calib_disabled_read(struct file *file,
|
||||
char __user *user_buf,
|
||||
|
@ -2334,7 +2336,9 @@ DEBUGFS_READ_FILE_OPS(bt_traffic);
|
|||
DEBUGFS_READ_WRITE_FILE_OPS(protection_mode);
|
||||
DEBUGFS_READ_FILE_OPS(reply_tx_error);
|
||||
DEBUGFS_WRITE_FILE_OPS(echo_test);
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(log_event);
|
||||
#endif
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(calib_disabled);
|
||||
|
||||
/*
|
||||
|
@ -2394,7 +2398,9 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name)
|
|||
DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR);
|
||||
DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR);
|
||||
DEBUGFS_ADD_FILE(echo_test, dir_debug, S_IWUSR);
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
DEBUGFS_ADD_FILE(log_event, dir_debug, S_IWUSR | S_IRUSR);
|
||||
#endif
|
||||
|
||||
if (iwl_advanced_bt_coexist(priv))
|
||||
DEBUGFS_ADD_FILE(bt_traffic, dir_debug, S_IRUSR);
|
||||
|
|
|
@ -1484,7 +1484,7 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
|||
struct wireless_dev *wdev;
|
||||
|
||||
if (!adapter)
|
||||
return NULL;
|
||||
return ERR_PTR(-EFAULT);
|
||||
|
||||
switch (type) {
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
|
@ -1494,12 +1494,12 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
|||
if (priv->bss_mode) {
|
||||
wiphy_err(wiphy,
|
||||
"cannot create multiple sta/adhoc ifaces\n");
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
|
||||
if (!wdev)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
wdev->wiphy = wiphy;
|
||||
priv->wdev = wdev;
|
||||
|
@ -1522,12 +1522,12 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
|||
|
||||
if (priv->bss_mode) {
|
||||
wiphy_err(wiphy, "Can't create multiple AP interfaces");
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
|
||||
if (!wdev)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
priv->wdev = wdev;
|
||||
wdev->wiphy = wiphy;
|
||||
|
@ -1544,14 +1544,15 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
|||
break;
|
||||
default:
|
||||
wiphy_err(wiphy, "type not supported\n");
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
dev = alloc_netdev_mq(sizeof(struct mwifiex_private *), name,
|
||||
ether_setup, 1);
|
||||
if (!dev) {
|
||||
wiphy_err(wiphy, "no memory available for netdevice\n");
|
||||
goto error;
|
||||
priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
mwifiex_init_priv_params(priv, dev);
|
||||
|
@ -1582,7 +1583,9 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
|||
/* Register network device */
|
||||
if (register_netdevice(dev)) {
|
||||
wiphy_err(wiphy, "cannot register virtual network device\n");
|
||||
goto error;
|
||||
free_netdev(dev);
|
||||
priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
|
||||
return ERR_PTR(-EFAULT);
|
||||
}
|
||||
|
||||
sema_init(&priv->async_sem, 1);
|
||||
|
@ -1594,12 +1597,6 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
|||
mwifiex_dev_debugfs_init(priv);
|
||||
#endif
|
||||
return dev;
|
||||
error:
|
||||
if (dev && (dev->reg_state == NETREG_UNREGISTERED))
|
||||
free_netdev(dev);
|
||||
priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mwifiex_add_virtual_intf);
|
||||
|
||||
|
|
|
@ -161,15 +161,11 @@ int mwifiex_write_data_complete(struct mwifiex_adapter *adapter,
|
|||
goto done;
|
||||
|
||||
for (i = 0; i < adapter->priv_num; i++) {
|
||||
|
||||
tpriv = adapter->priv[i];
|
||||
|
||||
if ((GET_BSS_ROLE(tpriv) == MWIFIEX_BSS_ROLE_STA) &&
|
||||
(tpriv->media_connected)) {
|
||||
if (netif_queue_stopped(tpriv->netdev))
|
||||
mwifiex_wake_up_net_dev_queue(tpriv->netdev,
|
||||
adapter);
|
||||
}
|
||||
if (tpriv->media_connected &&
|
||||
netif_queue_stopped(tpriv->netdev))
|
||||
mwifiex_wake_up_net_dev_queue(tpriv->netdev, adapter);
|
||||
}
|
||||
done:
|
||||
dev_kfree_skb_any(skb);
|
||||
|
|
|
@ -869,7 +869,7 @@ int wl1251_acx_tsf_info(struct wl1251 *wl, u64 *mactime)
|
|||
}
|
||||
|
||||
*mactime = tsf_info->current_tsf_lsb |
|
||||
(tsf_info->current_tsf_msb << 31);
|
||||
((u64)tsf_info->current_tsf_msb << 32);
|
||||
|
||||
out:
|
||||
kfree(tsf_info);
|
||||
|
|
|
@ -76,8 +76,7 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
|
|||
}
|
||||
}
|
||||
|
||||
if (vector & SYNCHRONIZATION_TIMEOUT_EVENT_ID &&
|
||||
wl->station_mode != STATION_ACTIVE_MODE) {
|
||||
if (vector & SYNCHRONIZATION_TIMEOUT_EVENT_ID) {
|
||||
wl1251_debug(DEBUG_EVENT, "SYNCHRONIZATION_TIMEOUT_EVENT");
|
||||
|
||||
/* indicate to the stack, that beacons have been lost */
|
||||
|
|
|
@ -73,6 +73,8 @@ static void wl1251_spi_reset(struct wl1251 *wl)
|
|||
spi_sync(wl_to_spi(wl), &m);
|
||||
|
||||
wl1251_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN);
|
||||
|
||||
kfree(cmd);
|
||||
}
|
||||
|
||||
static void wl1251_spi_wake(struct wl1251 *wl)
|
||||
|
@ -127,6 +129,8 @@ static void wl1251_spi_wake(struct wl1251 *wl)
|
|||
spi_sync(wl_to_spi(wl), &m);
|
||||
|
||||
wl1251_dump(DEBUG_SPI, "spi init -> ", cmd, WSPI_INIT_CMD_LEN);
|
||||
|
||||
kfree(cmd);
|
||||
}
|
||||
|
||||
static void wl1251_spi_reset_wake(struct wl1251 *wl)
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Author: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -139,13 +139,14 @@ static void tt_orig_list_entry_free_rcu(struct rcu_head *rcu)
|
|||
struct tt_orig_list_entry *orig_entry;
|
||||
|
||||
orig_entry = container_of(rcu, struct tt_orig_list_entry, rcu);
|
||||
atomic_dec(&orig_entry->orig_node->tt_size);
|
||||
batadv_orig_node_free_ref(orig_entry->orig_node);
|
||||
kfree(orig_entry);
|
||||
}
|
||||
|
||||
static void tt_orig_list_entry_free_ref(struct tt_orig_list_entry *orig_entry)
|
||||
{
|
||||
/* to avoid race conditions, immediately decrease the tt counter */
|
||||
atomic_dec(&orig_entry->orig_node->tt_size);
|
||||
call_rcu(&orig_entry->rcu, tt_orig_list_entry_free_rcu);
|
||||
}
|
||||
|
||||
|
@ -958,7 +959,6 @@ void batadv_tt_global_del_orig(struct bat_priv *bat_priv,
|
|||
}
|
||||
spin_unlock_bh(list_lock);
|
||||
}
|
||||
atomic_set(&orig_node->tt_size, 0);
|
||||
orig_node->tt_initialised = false;
|
||||
}
|
||||
|
||||
|
@ -2148,10 +2148,10 @@ bool batadv_is_ap_isolated(struct bat_priv *bat_priv, uint8_t *src,
|
|||
{
|
||||
struct tt_local_entry *tt_local_entry = NULL;
|
||||
struct tt_global_entry *tt_global_entry = NULL;
|
||||
bool ret = true;
|
||||
bool ret = false;
|
||||
|
||||
if (!atomic_read(&bat_priv->ap_isolation))
|
||||
return false;
|
||||
goto out;
|
||||
|
||||
tt_local_entry = tt_local_hash_find(bat_priv, dst);
|
||||
if (!tt_local_entry)
|
||||
|
@ -2161,10 +2161,10 @@ bool batadv_is_ap_isolated(struct bat_priv *bat_priv, uint8_t *src,
|
|||
if (!tt_global_entry)
|
||||
goto out;
|
||||
|
||||
if (_is_ap_isolated(tt_local_entry, tt_global_entry))
|
||||
if (!_is_ap_isolated(tt_local_entry, tt_global_entry))
|
||||
goto out;
|
||||
|
||||
ret = false;
|
||||
ret = true;
|
||||
|
||||
out:
|
||||
if (tt_global_entry)
|
||||
|
|
|
@ -3278,12 +3278,14 @@ static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
|
|||
while (len >= L2CAP_CONF_OPT_SIZE) {
|
||||
len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
|
||||
|
||||
switch (type) {
|
||||
case L2CAP_CONF_RFC:
|
||||
if (olen == sizeof(rfc))
|
||||
memcpy(&rfc, (void *)val, olen);
|
||||
goto done;
|
||||
}
|
||||
if (type != L2CAP_CONF_RFC)
|
||||
continue;
|
||||
|
||||
if (olen != sizeof(rfc))
|
||||
break;
|
||||
|
||||
memcpy(&rfc, (void *)val, olen);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Use sane default values in case a misbehaving remote device
|
||||
|
|
|
@ -1598,7 +1598,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
|
|||
else
|
||||
conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
|
||||
|
||||
if (!conn) {
|
||||
if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
|
||||
err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_NOT_CONNECTED);
|
||||
goto failed;
|
||||
|
|
|
@ -4,8 +4,7 @@
|
|||
* Author: Sjur Brendeland/sjur.brandeland@stericsson.com
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*
|
||||
* Borrowed heavily from file: pn_dev.c. Thanks to
|
||||
* Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Borrowed heavily from file: pn_dev.c. Thanks to Remi Denis-Courmont
|
||||
* and Sakari Ailus <sakari.ailus@nokia.com>
|
||||
*/
|
||||
|
||||
|
|
|
@ -1350,8 +1350,8 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
|
|||
if (w->leaf && fn->fn_flags & RTN_RTINFO) {
|
||||
int err;
|
||||
|
||||
if (w->count < w->skip) {
|
||||
w->count++;
|
||||
if (w->skip) {
|
||||
w->skip--;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -2888,10 +2888,6 @@ static int __net_init ip6_route_net_init(struct net *net)
|
|||
net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
|
||||
net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops);
|
||||
proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops);
|
||||
#endif
|
||||
net->ipv6.ip6_rt_gc_expire = 30*HZ;
|
||||
|
||||
ret = 0;
|
||||
|
@ -2912,10 +2908,6 @@ static int __net_init ip6_route_net_init(struct net *net)
|
|||
|
||||
static void __net_exit ip6_route_net_exit(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_remove(net, "ipv6_route");
|
||||
proc_net_remove(net, "rt6_stats");
|
||||
#endif
|
||||
kfree(net->ipv6.ip6_null_entry);
|
||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||
kfree(net->ipv6.ip6_prohibit_entry);
|
||||
|
@ -2924,6 +2916,23 @@ static void __net_exit ip6_route_net_exit(struct net *net)
|
|||
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
|
||||
}
|
||||
|
||||
static int __net_init ip6_route_net_init_late(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops);
|
||||
proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __net_exit ip6_route_net_exit_late(struct net *net)
|
||||
{
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_net_remove(net, "ipv6_route");
|
||||
proc_net_remove(net, "rt6_stats");
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct pernet_operations ip6_route_net_ops = {
|
||||
.init = ip6_route_net_init,
|
||||
.exit = ip6_route_net_exit,
|
||||
|
@ -2954,6 +2963,11 @@ static struct pernet_operations ipv6_inetpeer_ops = {
|
|||
.exit = ipv6_inetpeer_exit,
|
||||
};
|
||||
|
||||
static struct pernet_operations ip6_route_net_late_ops = {
|
||||
.init = ip6_route_net_init_late,
|
||||
.exit = ip6_route_net_exit_late,
|
||||
};
|
||||
|
||||
static struct notifier_block ip6_route_dev_notifier = {
|
||||
.notifier_call = ip6_route_dev_notify,
|
||||
.priority = 0,
|
||||
|
@ -3007,19 +3021,25 @@ int __init ip6_route_init(void)
|
|||
if (ret)
|
||||
goto xfrm6_init;
|
||||
|
||||
ret = register_pernet_subsys(&ip6_route_net_late_ops);
|
||||
if (ret)
|
||||
goto fib6_rules_init;
|
||||
|
||||
ret = -ENOBUFS;
|
||||
if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
|
||||
__rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
|
||||
__rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
|
||||
goto fib6_rules_init;
|
||||
goto out_register_late_subsys;
|
||||
|
||||
ret = register_netdevice_notifier(&ip6_route_dev_notifier);
|
||||
if (ret)
|
||||
goto fib6_rules_init;
|
||||
goto out_register_late_subsys;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
out_register_late_subsys:
|
||||
unregister_pernet_subsys(&ip6_route_net_late_ops);
|
||||
fib6_rules_init:
|
||||
fib6_rules_cleanup();
|
||||
xfrm6_init:
|
||||
|
@ -3040,6 +3060,7 @@ int __init ip6_route_init(void)
|
|||
void ip6_route_cleanup(void)
|
||||
{
|
||||
unregister_netdevice_notifier(&ip6_route_dev_notifier);
|
||||
unregister_pernet_subsys(&ip6_route_net_late_ops);
|
||||
fib6_rules_cleanup();
|
||||
xfrm6_fini();
|
||||
fib6_gc_cleanup();
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Author: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Author: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Remi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Original author: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Authors: Sakari Ailus <sakari.ailus@nokia.com>
|
||||
* Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Copyright (C) 2008 Nokia Corporation.
|
||||
*
|
||||
* Contact: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
|
@ -673,7 +673,9 @@ void sctp_addr_wq_timeout_handler(unsigned long arg)
|
|||
SCTP_DEBUG_PRINTK("sctp_addrwq_timo_handler: sctp_asconf_mgmt failed\n");
|
||||
sctp_bh_unlock_sock(sk);
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
free_next:
|
||||
#endif
|
||||
list_del(&addrw->list);
|
||||
kfree(addrw);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue