static void be_link_status_update(struct be_adapter *adapter) { struct be_link_info *prev = &adapter->link; struct be_link_info now = { 0 }; struct net_device *netdev = adapter->netdev; be_cmd_link_status_query(&adapter->ctrl, &now); /* If link came up or went down */ if (now.speed != prev->speed && (now.speed == PHY_LINK_SPEED_ZERO || prev->speed == PHY_LINK_SPEED_ZERO)) { if (now.speed == PHY_LINK_SPEED_ZERO) { netif_stop_queue(netdev); netif_carrier_off(netdev); printk(KERN_INFO "%s: Link down\n", netdev->name); } else { netif_start_queue(netdev); netif_carrier_on(netdev); printk(KERN_INFO "%s: Link up\n", netdev->name); } } *prev = now; }
static int netvsc_open(struct net_device *net) { struct netvsc_device *nvdev = net_device_to_netvsc_device(net); struct rndis_device *rdev; int ret = 0; netif_carrier_off(net); /* Open up the device */ ret = rndis_filter_open(nvdev); if (ret != 0) { netdev_err(net, "unable to open device (ret %d).\n", ret); return ret; } netif_tx_wake_all_queues(net); rdev = nvdev->extension; if (!rdev->link_state) netif_carrier_on(net); return ret; }
static void smc_10bt_check_media(struct net_device *dev, int init) { struct smc_local *lp = netdev_priv(dev); void __iomem *ioaddr = lp->base; unsigned int old_carrier, new_carrier; old_carrier = netif_carrier_ok(dev) ? 1 : 0; SMC_SELECT_BANK(lp, 0); new_carrier = (SMC_GET_EPH_STATUS(lp) & ES_LINK_OK) ? 1 : 0; SMC_SELECT_BANK(lp, 2); if (init || (old_carrier != new_carrier)) { if (!new_carrier) { netif_carrier_off(dev); } else { netif_carrier_on(dev); } if (netif_msg_link(lp)) printk(KERN_INFO "%s: link %s\n", dev->name, new_carrier ? "up" : "down"); } }
/** * netvsc_linkstatus_callback - Link up/down notification */ static void netvsc_linkstatus_callback(struct hv_device *device_obj, unsigned int status) { struct vm_device *device_ctx = to_vm_device(device_obj); struct net_device *net = dev_get_drvdata(&device_ctx->device); DPRINT_ENTER(NETVSC_DRV); if (!net) { DPRINT_ERR(NETVSC_DRV, "got link status but net device " "not initialized yet"); return; } if (status == 1) { netif_carrier_on(net); netif_wake_queue(net); } else { netif_carrier_off(net); netif_stop_queue(net); } DPRINT_EXIT(NETVSC_DRV); }
static INT bcm_open(struct net_device *dev) { struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(dev); if (Adapter->fw_download_done == false) { pr_notice(PFX "%s: link up failed (download in progress)\n", dev->name); return -EBUSY; } if (netif_msg_ifup(Adapter)) pr_info(PFX "%s: enabling interface\n", dev->name); if (Adapter->LinkUpStatus) { if (netif_msg_link(Adapter)) pr_info(PFX "%s: link up\n", dev->name); netif_carrier_on(Adapter->dev); netif_start_queue(Adapter->dev); } return 0; }
static int eth_qc_open(struct net_device *net) { struct eth_qc_dev *dev = netdev_priv(net); struct qc_gether *link; DBG(dev, "%s\n", __func__); if (netif_carrier_ok(dev->net)) { /* Force the netif to send the RTM_NEWLINK event * that in use to notify on the USB cable status. */ netif_carrier_off(dev->net); netif_carrier_on(dev->net); netif_wake_queue(dev->net); } spin_lock_irq(&dev->lock); link = dev->port_usb; if (link && link->open) link->open(link); spin_unlock_irq(&dev->lock); return 0; }
/* * Send GARP packet to network peers after migrations. * After Quick Migration, the network is not immediately operational in the * current context when receiving RNDIS_STATUS_MEDIA_CONNECT event. So, add * another netif_notify_peers() into a delayed work, otherwise GARP packet * will not be sent after quick migration, and cause network disconnection. * Also, we update the carrier status here. */ static void netvsc_link_change(struct work_struct *w) { struct net_device_context *ndev_ctx; struct net_device *net; struct netvsc_device *net_device; struct rndis_device *rdev; bool notify, refresh = false; char *argv[] = { "/etc/init.d/network", "restart", NULL }; char *envp[] = { "HOME=/", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }; rtnl_lock(); ndev_ctx = container_of(w, struct net_device_context, dwork.work); net_device = hv_get_drvdata(ndev_ctx->device_ctx); rdev = net_device->extension; net = net_device->ndev; if (rdev->link_state) { netif_carrier_off(net); notify = false; } else { netif_carrier_on(net); notify = true; if (rdev->link_change) { rdev->link_change = false; refresh = true; } } rtnl_unlock(); if (refresh) call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); if (notify) netdev_notify_peers(net); }
void can_restart(unsigned long data) { struct net_device *dev = (struct net_device *)data; struct can_priv *priv = netdev_priv(dev); struct net_device_stats *stats = &dev->stats; struct sk_buff *skb; struct can_frame *cf; int err; BUG_ON(netif_carrier_ok(dev)); can_flush_echo_skb(dev); skb = alloc_can_err_skb(dev, &cf); if (skb == NULL) { err = -ENOMEM; goto restart; } cf->can_id |= CAN_ERR_RESTARTED; netif_rx(skb); stats->rx_packets++; stats->rx_bytes += cf->can_dlc; restart: netdev_dbg(dev, "restarted\n"); priv->can_stats.restarts++; err = priv->do_set_mode(dev, CAN_MODE_START); netif_carrier_on(dev); if (err) netdev_err(dev, "Error %d during restart", err); }
void usbnet_cdc_status(struct usbnet *dev, struct urb *urb) { struct usb_cdc_notification *event; if (urb->actual_length < sizeof *event) return; if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) { dumpspeed(dev, (__le32 *) urb->transfer_buffer); return; } event = urb->transfer_buffer; switch (event->bNotificationType) { case USB_CDC_NOTIFY_NETWORK_CONNECTION: netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n", event->wValue ? "on" : "off"); if (event->wValue) netif_carrier_on(dev->net); else netif_carrier_off(dev->net); break; case USB_CDC_NOTIFY_SPEED_CHANGE: netif_dbg(dev, timer, dev->net, "CDC: speed change (len %d)\n", urb->actual_length); if (urb->actual_length != (sizeof *event + 8)) set_bit(EVENT_STS_SPLIT, &dev->flags); else dumpspeed(dev, (__le32 *) &event[1]); break; default: netdev_err(dev->net, "CDC: unexpected notification %02x!\n", event->bNotificationType); break; } }
void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf) { struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_dev *mdev = priv->mdev; int i, carrier_ok; memset(buf, 0, sizeof(u64) * MLX4_EN_NUM_SELF_TEST); if (*flags & ETH_TEST_FL_OFFLINE) { /* disable the interface */ carrier_ok = netif_carrier_ok(dev); netif_carrier_off(dev); /* Wait until all tx queues are empty. * there should not be any additional incoming traffic * since we turned the carrier off */ msleep(200); if (priv->mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_UC_LOOPBACK) { buf[3] = mlx4_en_test_registers(priv); buf[4] = mlx4_en_test_loopback(priv); } if (carrier_ok) netif_carrier_on(dev); } buf[0] = mlx4_test_interrupts(mdev->dev); buf[1] = mlx4_en_test_link(priv); buf[2] = mlx4_en_test_speed(priv); for (i = 0; i < MLX4_EN_NUM_SELF_TEST; i++) { if (buf[i]) *flags |= ETH_TEST_FL_FAILED; } }
/** * \fn wlanDrvIf_Start * \brief Start driver * * Called by network stack upon opening network interface (ifconfig up). * Can also be called from user application or CLI for flight mode. * Start the driver initialization process up to OPERATIONAL state. * * \note * \param dev - The driver network-interface handle * \return 0 if succeeded, error if driver not available * \sa wlanDrvIf_Stop */ int wlanDrvIf_Start (struct net_device *dev) { TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Start()\n"); if (!drv->tCommon.hDrvMain) { ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Start() Driver not created!\n"); return -ENODEV; } /* * Insert Start command in DrvMain action queue, request driver scheduling * and wait for action completion (all init process). */ drvMain_InsertAction (drv->tCommon.hDrvMain, ACTION_TYPE_START); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) /* * Finalize network interface setup */ netif_start_queue (dev); #ifdef AP_MODE_ENABLED netif_carrier_on (dev); #endif /* register 3430 PM hooks in our SDIO driver */ #if defined HOST_PLATFORM_OMAP3430 || defined HOST_PLATFORM_ZOOM2 || defined HOST_PLATFORM_ZOOM1 || defined HOST_PLATFORM_MX25 /*sdioDrv_register_pm(wlanDrvIf_pm_resume, wlanDrvIf_pm_suspend);*/ #endif #endif return 0; }
void mlx5e_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) { struct mlx5e_priv *priv = netdev_priv(dev); struct mlx5_core_dev *mdev = priv->mdev; int carrier_ok = 0; memset(buf, 0, sizeof(u64) * MLX5E_NUM_SELF_TEST); if (netif_carrier_ok(dev)) { buf[MLX5E_LINK_SPEED] = mlx5e_test_link_speed(mdev); buf[MLX5E_LINK_STATE] = mlx5e_test_link_state(mdev); } buf[MLX5E_HEALTH_INFO] = mlx5e_test_health_info(mdev); if (etest->flags & ETH_TEST_FL_OFFLINE) { /* save current state */ carrier_ok = netif_carrier_ok(dev); /* disable the interface */ netif_carrier_off(dev); /* Wait until all tx queues are empty. * there should not be any additional incoming traffic * since we turned the carrier off */ msleep(200); #if 0 buf[MLX5E_LOOPBACK] = mlx5e_test_loopback(priv); #endif buf[MLX5E_LOOPBACK] = 0; if (carrier_ok) netif_carrier_on(dev); } }
static int ipheth_carrier_set(struct ipheth_device *dev) { struct usb_device *udev = dev->udev; int retval; if ((retval = usb_control_msg(udev, usb_rcvctrlpipe(udev, IPHETH_CTRL_ENDP), IPHETH_CMD_CARRIER_CHECK, /* request */ 0xc0, /* request type */ 0x00, /* value */ 0x02, /* index */ dev->ctrl_buf, IPHETH_CTRL_BUF_SIZE, IPHETH_CTRL_TIMEOUT)) < 0) { err("%s: usb_control_msg: %d", __func__, retval); return retval; } if (dev->ctrl_buf[0] == IPHETH_CARRIER_ON) netif_carrier_on(dev->net); else netif_carrier_off(dev->net); return 0; }
static int bgmac_open(struct net_device *net_dev) { struct bgmac *bgmac = netdev_priv(net_dev); int err = 0; bgmac_chip_reset(bgmac); /* Specs say about reclaiming rings here, but we do that in DMA init */ bgmac_chip_init(bgmac, true); err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED, KBUILD_MODNAME, net_dev); if (err < 0) { bgmac_err(bgmac, "IRQ request error: %d!\n", err); goto err_out; } napi_enable(&bgmac->napi); phy_start(bgmac->phy_dev); netif_carrier_on(net_dev); err_out: return err; }
void rtw_os_indicate_connect(_adapter *adapter) { struct mlme_priv *pmlmepriv = &adapter->mlmepriv; _func_enter_; #ifdef CONFIG_IOCTL_CFG80211 rtw_cfg80211_indicate_connect(adapter); #endif //CONFIG_IOCTL_CFG80211 rtw_indicate_wx_assoc_event(adapter); netif_carrier_on(adapter->pnetdev); if(adapter->pid[2] !=0) rtw_signal_process(adapter->pid[2], SIGALRM); #ifdef RTK_DMP_PLATFORM _set_workitem(&pmlmepriv->Linkup_workitem); #endif _func_exit_; }
/* * netvsc_linkstatus_callback - Link up/down notification */ static void netvsc_linkstatus_callback(struct hv_device *device_obj, unsigned int status) { struct vm_device *device_ctx = to_vm_device(device_obj); struct net_device_context *ndev_ctx; struct net_device *net = dev_get_drvdata(&device_ctx->device); if (!net) { DPRINT_ERR(NETVSC_DRV, "got link status but net device " "not initialized yet"); return; } if (status == 1) { netif_carrier_on(net); netif_wake_queue(net); netif_notify_peers(net); ndev_ctx = netdev_priv(net); schedule_work(&ndev_ctx->work); } else { netif_carrier_off(net); netif_stop_queue(net); } }
int igb_vmdq_open(struct net_device *dev) { struct igb_vmdq_adapter *vadapter = netdev_priv(dev); struct igb_adapter *adapter = vadapter->real_adapter; struct net_device *main_netdev = adapter->netdev; int hw_queue = vadapter->rx_ring->queue_index + adapter->vfs_allocated_count; if (test_bit(__IGB_DOWN, &adapter->state)) { DPRINTK(DRV, WARNING, "Open %s before opening this device.\n", main_netdev->name); return -EAGAIN; } netif_carrier_off(dev); vadapter->tx_ring->vmdq_netdev = dev; vadapter->rx_ring->vmdq_netdev = dev; if (is_valid_ether_addr(dev->dev_addr)) { igb_del_mac_filter(adapter, dev->dev_addr, hw_queue); igb_add_mac_filter(adapter, dev->dev_addr, hw_queue); } netif_carrier_on(dev); return 0; }
static void smd_net_notify(void *_dev, unsigned event) { struct rmnet_private *p = netdev_priv((struct net_device *)_dev); switch (event) { case SMD_EVENT_DATA: spin_lock(&p->lock); if (p->skb && (smd_write_avail(p->ch) >= p->skb->len)) { smd_disable_read_intr(p->ch); tasklet_hi_schedule(&p->tsklt); } spin_unlock(&p->lock); if (smd_read_avail(p->ch) && (smd_read_avail(p->ch) >= smd_cur_packet_size(p->ch))) { smd_net_data_tasklet.data = (unsigned long) _dev; tasklet_schedule(&smd_net_data_tasklet); } break; case SMD_EVENT_OPEN: DBG0("%s: opening SMD port\n", __func__); netif_carrier_on(_dev); if (netif_queue_stopped(_dev)) { DBG0("%s: re-starting if queue\n", __func__); netif_wake_queue(_dev); } break; case SMD_EVENT_CLOSE: DBG0("%s: closing SMD port\n", __func__); netif_carrier_off(_dev); break; } }
int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); if(enable) ieee->raw_tx = 1; else ieee->raw_tx = 0; printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if (ieee->iw_mode == IW_MODE_MONITOR) { if (prev == 0 && ieee->raw_tx) { if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } if(prev && ieee->raw_tx == 1) netif_carrier_off(ieee->dev); } up(&ieee->wx_sem); return 0; }
/* Incoming data */ static void zd1201_usbrx(struct urb *urb) { struct zd1201 *zd = urb->context; int free = 0; unsigned char *data = urb->transfer_buffer; struct sk_buff *skb; unsigned char type; if (!zd) return; switch(urb->status) { case -EILSEQ: case -ENODEV: case -ETIME: case -ENOENT: case -EPIPE: case -EOVERFLOW: case -ESHUTDOWN: dev_warn(&zd->usb->dev, "%s: rx urb failed: %d\n", zd->dev->name, urb->status); free = 1; goto exit; } if (urb->status != 0 || urb->actual_length == 0) goto resubmit; type = data[0]; if (type == ZD1201_PACKET_EVENTSTAT || type == ZD1201_PACKET_RESOURCE) { memcpy(zd->rxdata, data, urb->actual_length); zd->rxlen = urb->actual_length; zd->rxdatas = 1; wake_up(&zd->rxdataq); } /* Info frame */ if (type == ZD1201_PACKET_INQUIRE) { int i = 0; unsigned short infotype, framelen, copylen; framelen = le16_to_cpu(*(__le16*)&data[4]); infotype = le16_to_cpu(*(__le16*)&data[6]); if (infotype == ZD1201_INF_LINKSTATUS) { short linkstatus; linkstatus = le16_to_cpu(*(__le16*)&data[8]); switch(linkstatus) { case 1: netif_carrier_on(zd->dev); break; case 2: netif_carrier_off(zd->dev); break; case 3: netif_carrier_off(zd->dev); break; case 4: netif_carrier_on(zd->dev); break; default: netif_carrier_off(zd->dev); } goto resubmit; } if (infotype == ZD1201_INF_ASSOCSTATUS) { short status = le16_to_cpu(*(__le16*)(data+8)); int event; union iwreq_data wrqu; switch (status) { case ZD1201_ASSOCSTATUS_STAASSOC: case ZD1201_ASSOCSTATUS_REASSOC: event = IWEVREGISTERED; break; case ZD1201_ASSOCSTATUS_DISASSOC: case ZD1201_ASSOCSTATUS_ASSOCFAIL: case ZD1201_ASSOCSTATUS_AUTHFAIL: default: event = IWEVEXPIRED; } memcpy(wrqu.addr.sa_data, data+10, ETH_ALEN); wrqu.addr.sa_family = ARPHRD_ETHER; /* Send event to user space */ wireless_send_event(zd->dev, event, &wrqu, NULL); goto resubmit; } if (infotype == ZD1201_INF_AUTHREQ) { union iwreq_data wrqu; memcpy(wrqu.addr.sa_data, data+8, ETH_ALEN); wrqu.addr.sa_family = ARPHRD_ETHER; /* There isn't a event that trully fits this request. We assume that userspace will be smart enough to see a new station being expired and sends back a authstation ioctl to authorize it. */ wireless_send_event(zd->dev, IWEVEXPIRED, &wrqu, NULL); goto resubmit; } /* Other infotypes are handled outside this handler */ zd->rxlen = 0; while (i < urb->actual_length) { copylen = le16_to_cpu(*(__le16*)&data[i+2]); /* Sanity check, sometimes we get junk */ if (copylen+zd->rxlen > sizeof(zd->rxdata)) break; memcpy(zd->rxdata+zd->rxlen, data+i+4, copylen); zd->rxlen += copylen; i += 64; } if (i >= urb->actual_length) { zd->rxdatas = 1; wake_up(&zd->rxdataq); } goto resubmit; } /* Actual data */ if (data[urb->actual_length-1] == ZD1201_PACKET_RXDATA) { int datalen = urb->actual_length-1; unsigned short len, fc, seq; len = ntohs(*(__be16 *)&data[datalen-2]); if (len>datalen) len=datalen; fc = le16_to_cpu(*(__le16 *)&data[datalen-16]); seq = le16_to_cpu(*(__le16 *)&data[datalen-24]); if (zd->monitor) { if (datalen < 24) goto resubmit; if (!(skb = dev_alloc_skb(datalen+24))) goto resubmit; memcpy(skb_put(skb, 2), &data[datalen-16], 2); memcpy(skb_put(skb, 2), &data[datalen-2], 2); memcpy(skb_put(skb, 6), &data[datalen-14], 6); memcpy(skb_put(skb, 6), &data[datalen-22], 6); memcpy(skb_put(skb, 6), &data[datalen-8], 6); memcpy(skb_put(skb, 2), &data[datalen-24], 2); memcpy(skb_put(skb, len), data, len); skb->protocol = eth_type_trans(skb, zd->dev); zd->dev->stats.rx_packets++; zd->dev->stats.rx_bytes += skb->len; netif_rx(skb); goto resubmit; } if ((seq & IEEE80211_SCTL_FRAG) || (fc & IEEE80211_FCTL_MOREFRAGS)) { struct zd1201_frag *frag = NULL; char *ptr; if (datalen<14) goto resubmit; if ((seq & IEEE80211_SCTL_FRAG) == 0) { frag = kmalloc(sizeof(*frag), GFP_ATOMIC); if (!frag) goto resubmit; skb = dev_alloc_skb(IEEE80211_MAX_DATA_LEN +14+2); if (!skb) { kfree(frag); goto resubmit; } frag->skb = skb; frag->seq = seq & IEEE80211_SCTL_SEQ; skb_reserve(skb, 2); memcpy(skb_put(skb, 12), &data[datalen-14], 12); memcpy(skb_put(skb, 2), &data[6], 2); memcpy(skb_put(skb, len), data+8, len); hlist_add_head(&frag->fnode, &zd->fraglist); goto resubmit; } hlist_for_each_entry(frag, &zd->fraglist, fnode) if (frag->seq == (seq&IEEE80211_SCTL_SEQ)) break; if (!frag) goto resubmit; skb = frag->skb; ptr = skb_put(skb, len); if (ptr) memcpy(ptr, data+8, len); if (fc & IEEE80211_FCTL_MOREFRAGS) goto resubmit; hlist_del_init(&frag->fnode); kfree(frag); } else { if (datalen<14)
/* Handle the 21143 uniquely: do autoselect with NWay, not the EEPROM list of available transceivers. */ void t21142_media_task(struct work_struct *work) { struct tulip_private *tp = container_of(work, struct tulip_private, media_work); struct net_device *dev = tp->dev; void __iomem *ioaddr = tp->base_addr; int csr12 = ioread32(ioaddr + CSR12); int next_tick = 60*HZ; int new_csr6 = 0; int csr14 = ioread32(ioaddr + CSR14); /* CSR12[LS10,LS100] are not reliable during autonegotiation */ if ((csr14 & 0x80) && (csr12 & 0x7000) != 0x5000) csr12 |= 6; if (tulip_debug > 2) dev_info(&dev->dev, "21143 negotiation status %08x, %s\n", csr12, medianame[dev->if_port]); if (tulip_media_cap[dev->if_port] & MediaIsMII) { if (tulip_check_duplex(dev) < 0) { netif_carrier_off(dev); next_tick = 3*HZ; } else { netif_carrier_on(dev); next_tick = 60*HZ; } } else if (tp->nwayset) { /* Don't screw up a negotiated session! */ if (tulip_debug > 1) dev_info(&dev->dev, "Using NWay-set %s media, csr12 %08x\n", medianame[dev->if_port], csr12); } else if (tp->medialock) { ; } else if (dev->if_port == 3) { if (csr12 & 2) { /* No 100mbps link beat, revert to 10mbps. */ if (tulip_debug > 1) dev_info(&dev->dev, "No 21143 100baseTx link beat, %08x, trying NWay\n", csr12); t21142_start_nway(dev); next_tick = 3*HZ; } } else if ((csr12 & 0x7000) != 0x5000) { /* Negotiation failed. Search media types. */ if (tulip_debug > 1) dev_info(&dev->dev, "21143 negotiation failed, status %08x\n", csr12); if (!(csr12 & 4)) { /* 10mbps link beat good. */ new_csr6 = 0x82420000; dev->if_port = 0; iowrite32(0, ioaddr + CSR13); iowrite32(0x0003FFFF, ioaddr + CSR14); iowrite16(t21142_csr15[dev->if_port], ioaddr + CSR15); iowrite32(t21142_csr13[dev->if_port], ioaddr + CSR13); } else { /* Select 100mbps port to check for link beat. */ new_csr6 = 0x83860000; dev->if_port = 3; iowrite32(0, ioaddr + CSR13); iowrite32(0x0003FFFF, ioaddr + CSR14); iowrite16(8, ioaddr + CSR15); iowrite32(1, ioaddr + CSR13); } if (tulip_debug > 1) dev_info(&dev->dev, "Testing new 21143 media %s\n", medianame[dev->if_port]); if (new_csr6 != (tp->csr6 & ~0x00D5)) { tp->csr6 &= 0x00D5; tp->csr6 |= new_csr6; iowrite32(0x0301, ioaddr + CSR12); tulip_restart_rxtx(tp); } next_tick = 3*HZ; } /* mod_timer synchronizes us with potential add_timer calls * from interrupts. */ mod_timer(&tp->timer, RUN_AT(next_tick)); }
int usbdrv_open(struct net_device *dev) { struct usbdrv_private *macp = dev->ml_priv; int rc = 0; u16_t size; void* mem; //unsigned char addr[6]; struct zsCbFuncTbl cbFuncTbl; printk("Enter open()\n"); if (macp->driver_isolated) { rc = -EBUSY; goto exit; } size = zfiGlobalDataSize(dev); mem = kmalloc(size, GFP_KERNEL); if (mem == NULL) { rc = -EBUSY; goto exit; } macp->wd = mem; memset(&cbFuncTbl, 0, sizeof(struct zsCbFuncTbl)); cbFuncTbl.zfcbAuthNotify = zfLnxAuthNotify; cbFuncTbl.zfcbAuthNotify = zfLnxAuthNotify; cbFuncTbl.zfcbAsocNotify = zfLnxAsocNotify; cbFuncTbl.zfcbDisAsocNotify = zfLnxDisAsocNotify; cbFuncTbl.zfcbApConnectNotify = zfLnxApConnectNotify; cbFuncTbl.zfcbConnectNotify = zfLnxConnectNotify; cbFuncTbl.zfcbScanNotify = zfLnxScanNotify; cbFuncTbl.zfcbMicFailureNotify = zfLnxMicFailureNotify; cbFuncTbl.zfcbApMicFailureNotify = zfLnxApMicFailureNotify; cbFuncTbl.zfcbIbssPartnerNotify = zfLnxIbssPartnerNotify; cbFuncTbl.zfcbMacAddressNotify = zfLnxMacAddressNotify; cbFuncTbl.zfcbSendCompleteIndication = zfLnxSendCompleteIndication; cbFuncTbl.zfcbRecvEth = zfLnxRecvEth; cbFuncTbl.zfcbRecv80211 = zfLnxRecv80211; cbFuncTbl.zfcbRestoreBufData = zfLnxRestoreBufData; #ifdef ZM_ENABLE_CENC cbFuncTbl.zfcbCencAsocNotify = zfLnxCencAsocNotify; #endif //ZM_ENABLE_CENC cbFuncTbl.zfcbHwWatchDogNotify = zfLnxWatchDogNotify; zfiWlanOpen(dev, &cbFuncTbl); #if 0 { //u16_t mac[3] = {0x1300, 0xb6d4, 0x5aaf}; u16_t mac[3] = {0x8000, 0x00ab, 0x0000}; //zfiWlanSetMacAddress(dev, mac); } /* MAC address */ zfiWlanQueryMacAddress(dev, addr); dev->dev_addr[0] = addr[0]; dev->dev_addr[1] = addr[1]; dev->dev_addr[2] = addr[2]; dev->dev_addr[3] = addr[3]; dev->dev_addr[4] = addr[4]; dev->dev_addr[5] = addr[5]; #endif /* zfwMacAddressNotify() will be called to setup dev->dev_addr[] */ zfLnxCreateThread(dev); mod_timer(&(macp->hbTimer10ms), jiffies + (1*HZ)/100); /* 10 ms */ netif_carrier_on(dev); netif_start_queue(dev); #if ZM_AP_MODE == 1 zfiWlanSetWlanMode(dev, ZM_MODE_AP); zfiWlanSetBasicRate(dev, 0xf, 0, 0); zfiWlanSetSSID(dev, "OTUS_CWY", 8); zfiWlanSetDtimCount(dev, 3); #if ZM_WEP_MOME == 1 { u8_t key[16] = {0x12, 0x34, 0x56, 0x78, 0x90}; struct zsKeyInfo keyInfo; keyInfo.keyLength = 5; keyInfo.keyIndex = 0; keyInfo.flag = 0; keyInfo.key = key; zfiWlanSetKey(dev, keyInfo); zfiWlanSetEncryMode(dev, ZM_WEP64); } #if ZM_SHARE_AUTH == 1 zfiWlanSetAuthenticationMode(dev, 1); #endif /* #if ZM_SHARE_AUTH == 1 */ #endif /* #if ZM_WEP_MOME == 1 */ #elif ZM_PIBSS_MODE == 1 zfiWlanSetWlanMode(dev, ZM_MODE_PSEUDO); #else zfiWlanSetWlanMode(dev, ZM_MODE_INFRASTRUCTURE); #endif /* zfiWlanSetChannel(dev, ZM_CHANNEL, FALSE); */ zfiWlanSetFrequency(dev, 2462000, FALSE); zfiWlanSetRtsThreshold(dev, 32767); zfiWlanSetFragThreshold(dev, 0); zfiWlanEnable(dev); #ifdef ZM_ENABLE_CENC macp->netlink_sk = netlink_kernel_create(NETLINK_USERSOCK, 1, NULL, THIS_MODULE); if (macp->netlink_sk == NULL) { printk(KERN_ERR "Can't create NETLINK socket\n"); } #endif macp->DeviceOpened = 1; exit: //#ifndef CONFIG_SMP // read_unlock(&(macp->isolate_lock)); //#endif //zfRegisterWdsDev(dev, 0); //zfLnxRegisterVapDev(dev, 0); return rc; }
/** * mii_check_media - check the MII interface for a duplex change * @mii: the MII interface * @ok_to_print: OK to print link up/down messages * @init_media: OK to save duplex mode in @mii * * Returns 1 if the duplex mode changed, 0 if not. * If the media type is forced, always returns 0. */ unsigned int mii_check_media (struct mii_if_info *mii, unsigned int ok_to_print, unsigned int init_media) { unsigned int old_carrier, new_carrier; int advertise, lpa, media, duplex; int lpa2 = 0; /* if forced media, go no further */ if (mii->force_media) return 0; /* duplex did not change */ /* check current and old link status */ old_carrier = netif_carrier_ok(mii->dev) ? 1 : 0; new_carrier = (unsigned int) mii_link_ok(mii); /* if carrier state did not change, this is a "bounce", * just exit as everything is already set correctly */ if ((!init_media) && (old_carrier == new_carrier)) return 0; /* duplex did not change */ /* no carrier, nothing much to do */ if (!new_carrier) { netif_carrier_off(mii->dev); if (ok_to_print) netdev_info(mii->dev, "link down\n"); return 0; /* duplex did not change */ } /* * we have carrier, see who's on the other end */ netif_carrier_on(mii->dev); /* get MII advertise and LPA values */ if ((!init_media) && (mii->advertising)) advertise = mii->advertising; else { advertise = mii->mdio_read(mii->dev, mii->phy_id, MII_ADVERTISE); mii->advertising = advertise; } lpa = mii->mdio_read(mii->dev, mii->phy_id, MII_LPA); if (mii->supports_gmii) lpa2 = mii->mdio_read(mii->dev, mii->phy_id, MII_STAT1000); /* figure out media and duplex from advertise and LPA values */ media = mii_nway_result(lpa & advertise); duplex = (media & ADVERTISE_FULL) ? 1 : 0; if (lpa2 & LPA_1000FULL) duplex = 1; if (ok_to_print) netdev_info(mii->dev, "link up, %uMbps, %s-duplex, lpa 0x%04X\n", lpa2 & (LPA_1000FULL | LPA_1000HALF) ? 1000 : media & (ADVERTISE_100FULL | ADVERTISE_100HALF) ? 100 : 10, duplex ? "full" : "half", lpa); if ((init_media) || (mii->full_duplex != duplex)) { mii->full_duplex = duplex; return 1; /* duplex changed */ } return 0; /* duplex did not change */ }
/* * Set the current state of a WiMAX device [unlocking version of * wimax_state_change(). */ void __wimax_state_change(struct wimax_dev *wimax_dev, enum wimax_st new_state) { struct device *dev = wimax_dev_to_dev(wimax_dev); enum wimax_st old_state = wimax_dev->state; struct sk_buff *stch_skb; void *header; d_fnstart(3, dev, "(wimax_dev %p new_state %u [old %u])\n", wimax_dev, new_state, old_state); if (WARN_ON(new_state >= __WIMAX_ST_INVALID)) { dev_err(dev, "SW BUG: requesting invalid state %u\n", new_state); goto out; } if (old_state == new_state) goto out; header = NULL; /* gcc complains? can't grok why */ stch_skb = wimax_gnl_re_state_change_alloc( wimax_dev, new_state, old_state, &header); /* Verify the state transition and do exit-from-state actions */ switch (old_state) { case __WIMAX_ST_NULL: __check_new_state(old_state, new_state, 1 << WIMAX_ST_DOWN); break; case WIMAX_ST_DOWN: __check_new_state(old_state, new_state, 1 << __WIMAX_ST_QUIESCING | 1 << WIMAX_ST_UNINITIALIZED | 1 << WIMAX_ST_RADIO_OFF); break; case __WIMAX_ST_QUIESCING: __check_new_state(old_state, new_state, 1 << WIMAX_ST_DOWN); break; case WIMAX_ST_UNINITIALIZED: __check_new_state(old_state, new_state, 1 << __WIMAX_ST_QUIESCING | 1 << WIMAX_ST_RADIO_OFF); break; case WIMAX_ST_RADIO_OFF: __check_new_state(old_state, new_state, 1 << __WIMAX_ST_QUIESCING | 1 << WIMAX_ST_READY); break; case WIMAX_ST_READY: __check_new_state(old_state, new_state, 1 << __WIMAX_ST_QUIESCING | 1 << WIMAX_ST_RADIO_OFF | 1 << WIMAX_ST_SCANNING | 1 << WIMAX_ST_CONNECTING | 1 << WIMAX_ST_CONNECTED); break; case WIMAX_ST_SCANNING: __check_new_state(old_state, new_state, 1 << __WIMAX_ST_QUIESCING | 1 << WIMAX_ST_RADIO_OFF | 1 << WIMAX_ST_READY | 1 << WIMAX_ST_CONNECTING | 1 << WIMAX_ST_CONNECTED); break; case WIMAX_ST_CONNECTING: __check_new_state(old_state, new_state, 1 << __WIMAX_ST_QUIESCING | 1 << WIMAX_ST_RADIO_OFF | 1 << WIMAX_ST_READY | 1 << WIMAX_ST_SCANNING | 1 << WIMAX_ST_CONNECTED); break; case WIMAX_ST_CONNECTED: __check_new_state(old_state, new_state, 1 << __WIMAX_ST_QUIESCING | 1 << WIMAX_ST_RADIO_OFF | 1 << WIMAX_ST_READY); netif_tx_disable(wimax_dev->net_dev); netif_carrier_off(wimax_dev->net_dev); break; case __WIMAX_ST_INVALID: default: dev_err(dev, "SW BUG: wimax_dev %p is in unknown state %u\n", wimax_dev, wimax_dev->state); WARN_ON(1); goto out; } /* Execute the actions of entry to the new state */ switch (new_state) { case __WIMAX_ST_NULL: dev_err(dev, "SW BUG: wimax_dev %p entering NULL state " "from %u\n", wimax_dev, wimax_dev->state); WARN_ON(1); /* Nobody can enter this state */ break; case WIMAX_ST_DOWN: break; case __WIMAX_ST_QUIESCING: break; case WIMAX_ST_UNINITIALIZED: break; case WIMAX_ST_RADIO_OFF: break; case WIMAX_ST_READY: break; case WIMAX_ST_SCANNING: break; case WIMAX_ST_CONNECTING: break; case WIMAX_ST_CONNECTED: netif_carrier_on(wimax_dev->net_dev); netif_wake_queue(wimax_dev->net_dev); break; case __WIMAX_ST_INVALID: default: BUG(); } __wimax_state_set(wimax_dev, new_state); if (stch_skb) wimax_gnl_re_state_change_send(wimax_dev, stch_skb, header); out: d_fnend(3, dev, "(wimax_dev %p new_state %u [old %u]) = void\n", wimax_dev, new_state, old_state); return; }
/* * This function handles the command response of ad-hoc start and * ad-hoc join. * * The function generates a device-connected event to notify * the applications, in case of successful ad-hoc start/join, and * saves the beacon buffer. */ int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv, struct host_cmd_ds_command *resp) { int ret = 0; struct mwifiex_adapter *adapter = priv->adapter; struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result; struct mwifiex_bssdescriptor *bss_desc; u16 reason_code; adhoc_result = &resp->params.adhoc_result; bss_desc = priv->attempted_bss_desc; /* Join result code 0 --> SUCCESS */ reason_code = le16_to_cpu(resp->result); if (reason_code) { dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n"); if (priv->media_connected) mwifiex_reset_connect_state(priv, reason_code); memset(&priv->curr_bss_params.bss_descriptor, 0x00, sizeof(struct mwifiex_bssdescriptor)); ret = -1; goto done; } /* Send a Media Connected event, according to the Spec */ priv->media_connected = true; if (le16_to_cpu(resp->command) == HostCmd_CMD_802_11_AD_HOC_START) { dev_dbg(priv->adapter->dev, "info: ADHOC_S_RESP %s\n", bss_desc->ssid.ssid); /* Update the created network descriptor with the new BSSID */ memcpy(bss_desc->mac_address, adhoc_result->bssid, ETH_ALEN); priv->adhoc_state = ADHOC_STARTED; } else { /* * Now the join cmd should be successful. * If BSSID has changed use SSID to compare instead of BSSID */ dev_dbg(priv->adapter->dev, "info: ADHOC_J_RESP %s\n", bss_desc->ssid.ssid); /* * Make a copy of current BSSID descriptor, only needed for * join since the current descriptor is already being used * for adhoc start */ memcpy(&priv->curr_bss_params.bss_descriptor, bss_desc, sizeof(struct mwifiex_bssdescriptor)); priv->adhoc_state = ADHOC_JOINED; } dev_dbg(priv->adapter->dev, "info: ADHOC_RESP: channel = %d\n", priv->adhoc_channel); dev_dbg(priv->adapter->dev, "info: ADHOC_RESP: BSSID = %pM\n", priv->curr_bss_params.bss_descriptor.mac_address); if (!netif_carrier_ok(priv->netdev)) netif_carrier_on(priv->netdev); mwifiex_wake_up_net_dev_queue(priv->netdev, adapter); mwifiex_save_curr_bcn(priv); done: /* Need to indicate IOCTL complete */ if (adapter->curr_cmd->wait_q_enabled) { if (ret) adapter->cmd_wait_q.status = -1; else adapter->cmd_wait_q.status = 0; } return ret; }
static int rt2860_resume( struct pci_dev *pci_dev) { struct net_device *net_dev = pci_get_drvdata(pci_dev); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10) INT32 retval; // set the power state of a PCI device // PCI has 4 power states, DO (normal) ~ D3(less power) // in include/linux/pci.h, you can find that // #define PCI_D0 ((pci_power_t __force) 0) // #define PCI_D1 ((pci_power_t __force) 1) // #define PCI_D2 ((pci_power_t __force) 2) // #define PCI_D3hot ((pci_power_t __force) 3) // #define PCI_D3cold ((pci_power_t __force) 4) // #define PCI_UNKNOWN ((pci_power_t __force) 5) // #define PCI_POWER_ERROR ((pci_power_t __force) -1) retval = pci_set_power_state(pci_dev, PCI_D0); // restore the saved state of a PCI device pci_restore_state(pci_dev); // initialize device before it's used by a driver if (pci_enable_device(pci_dev)) { printk("pci enable fail!\n"); return 0; } #endif DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n")); if (net_dev == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); } else GET_PAD_FROM_NET_DEV(pAd, net_dev); if (pAd != NULL) { /* we can not use IFF_UP because ra0 down but ra1 up */ /* and 1 suspend/resume function for 1 module, not for each interface */ /* so Linux will call suspend/resume function once */ if (VIRTUAL_IF_NUM(pAd) > 0) { // mark device as attached from system and restart if needed netif_device_attach(net_dev); if (rt28xx_open((PNET_DEV)net_dev) != 0) { // open fail DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); return 0; } // increase MODULE use count RT_MOD_INC_USE_COUNT(); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); } } DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); return 0; }
/* * restart auto-negotiation, config UMAC and RGMII block */ void mii_setup(struct net_device *dev) { struct BcmEnet_devctrl *pDevCtrl = netdev_priv(dev); struct ethtool_cmd ecmd ; volatile struct uniMacRegs *umac = pDevCtrl->umac; TRACE(("%s: %s\n", __func__, netif_carrier_ok(pDevCtrl->dev) ? "netif_carrier_on" : "netif_carrier_off")); if (pDevCtrl->phyType == BRCM_PHY_TYPE_MOCA) { /* MoCA case */ netif_carrier_on(pDevCtrl->dev); pDevCtrl->dev->flags |= IFF_RUNNING; return ; } mii_ethtool_gset(&pDevCtrl->mii, &ecmd); if (mii_link_ok(&pDevCtrl->mii) && !netif_carrier_ok(pDevCtrl->dev)) { printk(KERN_INFO "%s: Link is up, %d Mbps %s Duplex\n", pDevCtrl->dev->name, ecmd.speed, ecmd.duplex == DUPLEX_FULL ? "Full" : "Half"); } else if (!mii_link_ok(&pDevCtrl->mii) && netif_carrier_ok(pDevCtrl->dev)) { printk(KERN_INFO "%s: Link is down\n", pDevCtrl->dev->name); return; } mii_check_link(&pDevCtrl->mii); /* * program UMAC and RGMII block accordingly, if the PHY is * not capable of in-band signaling. */ if (pDevCtrl->phyType != BRCM_PHY_TYPE_EXT_RGMII_IBS) { GENET_RGMII_OOB_CTRL(pDevCtrl) &= ~OOB_DISABLE; GENET_RGMII_OOB_CTRL(pDevCtrl) |= RGMII_LINK; if (ecmd.duplex == DUPLEX_FULL) umac->cmd &= ~CMD_HD_EN; else umac->cmd |= CMD_HD_EN; /* speed */ umac->cmd = umac->cmd & ~(CMD_SPEED_MASK << CMD_SPEED_SHIFT); if (ecmd.speed == SPEED_10) umac->cmd |= (UMAC_SPEED_10 << CMD_SPEED_SHIFT); else if (ecmd.speed == SPEED_100) umac->cmd |= (UMAC_SPEED_100 << CMD_SPEED_SHIFT); else if (ecmd.speed == SPEED_1000) umac->cmd |= (UMAC_SPEED_1000 << CMD_SPEED_SHIFT); } /* pause capability */ if (pDevCtrl->phyType == BRCM_PHY_TYPE_INT || pDevCtrl->phyType == BRCM_PHY_TYPE_EXT_MII) { unsigned int val; val = mii_read(dev, pDevCtrl->phyAddr, MII_LPA); if (!(val & LPA_PAUSE_CAP)) { umac->cmd |= CMD_RX_PAUSE_IGNORE; umac->cmd |= CMD_TX_PAUSE_IGNORE; } } else if (pDevCtrl->phyType == BRCM_PHY_TYPE_EXT_RGMII || pDevCtrl->phyType == BRCM_PHY_TYPE_EXT_RGMII_IBS) { unsigned int val; val = mii_read(dev, pDevCtrl->phyAddr, MII_BRCM_AUX_STAT_SUM); if (!(val & MII_BRCM_AUX_GPHY_RX_PAUSE)) umac->cmd |= CMD_RX_PAUSE_IGNORE; if (!(val & MII_BRCM_AUX_GPHY_TX_PAUSE)) umac->cmd |= CMD_TX_PAUSE_IGNORE; } }
/* * Association firmware command response handler * * The response buffer for the association command has the following * memory layout. * * For cases where an association response was not received (indicated * by the CapInfo and AId field): * * .------------------------------------------------------------. * | Header(4 * sizeof(t_u16)): Standard command response hdr | * .------------------------------------------------------------. * | cap_info/Error Return(t_u16): | * | 0xFFFF(-1): Internal error | * | 0xFFFE(-2): Authentication unhandled message | * | 0xFFFD(-3): Authentication refused | * | 0xFFFC(-4): Timeout waiting for AP response | * .------------------------------------------------------------. * | status_code(t_u16): | * | If cap_info is -1: | * | An internal firmware failure prevented the | * | command from being processed. The status_code | * | will be set to 1. | * | | * | If cap_info is -2: | * | An authentication frame was received but was | * | not handled by the firmware. IEEE Status | * | code for the failure is returned. | * | | * | If cap_info is -3: | * | An authentication frame was received and the | * | status_code is the IEEE Status reported in the | * | response. | * | | * | If cap_info is -4: | * | (1) Association response timeout | * | (2) Authentication response timeout | * .------------------------------------------------------------. * | a_id(t_u16): 0xFFFF | * .------------------------------------------------------------. * * * For cases where an association response was received, the IEEE * standard association response frame is returned: * * .------------------------------------------------------------. * | Header(4 * sizeof(t_u16)): Standard command response hdr | * .------------------------------------------------------------. * | cap_info(t_u16): IEEE Capability | * .------------------------------------------------------------. * | status_code(t_u16): IEEE Status Code | * .------------------------------------------------------------. * | a_id(t_u16): IEEE Association ID | * .------------------------------------------------------------. * | IEEE IEs(variable): Any received IEs comprising the | * | remaining portion of a received | * | association response frame. | * .------------------------------------------------------------. * * For simplistic handling, the status_code field can be used to determine * an association success (0) or failure (non-zero). */ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, struct host_cmd_ds_command *resp) { struct mwifiex_adapter *adapter = priv->adapter; int ret = 0; struct ieee_types_assoc_rsp *assoc_rsp; struct mwifiex_bssdescriptor *bss_desc; bool enable_data = true; u16 cap_info, status_code; assoc_rsp = (struct ieee_types_assoc_rsp *) &resp->params; cap_info = le16_to_cpu(assoc_rsp->cap_info_bitmap); status_code = le16_to_cpu(assoc_rsp->status_code); priv->assoc_rsp_size = min(le16_to_cpu(resp->size) - S_DS_GEN, sizeof(priv->assoc_rsp_buf)); memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size); if (status_code) { priv->adapter->dbg.num_cmd_assoc_failure++; dev_err(priv->adapter->dev, "ASSOC_RESP: failed, status code=%d err=%#x a_id=%#x\n", status_code, cap_info, le16_to_cpu(assoc_rsp->a_id)); if (cap_info == MWIFIEX_TIMEOUT_FOR_AP_RESP) { if (status_code == MWIFIEX_STATUS_CODE_AUTH_TIMEOUT) ret = WLAN_STATUS_AUTH_TIMEOUT; else ret = WLAN_STATUS_UNSPECIFIED_FAILURE; } else { ret = status_code; } goto done; } /* Send a Media Connected event, according to the Spec */ priv->media_connected = true; priv->adapter->ps_state = PS_STATE_AWAKE; priv->adapter->pps_uapsd_mode = false; priv->adapter->tx_lock_flag = false; /* Set the attempted BSSID Index to current */ bss_desc = priv->attempted_bss_desc; dev_dbg(priv->adapter->dev, "info: ASSOC_RESP: %s\n", bss_desc->ssid.ssid); /* Make a copy of current BSSID descriptor */ memcpy(&priv->curr_bss_params.bss_descriptor, bss_desc, sizeof(struct mwifiex_bssdescriptor)); /* Update curr_bss_params */ priv->curr_bss_params.bss_descriptor.channel = bss_desc->phy_param_set.ds_param_set.current_chan; priv->curr_bss_params.band = (u8) bss_desc->bss_band; if (bss_desc->wmm_ie.vend_hdr.element_id == WLAN_EID_VENDOR_SPECIFIC) priv->curr_bss_params.wmm_enabled = true; else priv->curr_bss_params.wmm_enabled = false; if ((priv->wmm_required || bss_desc->bcn_ht_cap) && priv->curr_bss_params.wmm_enabled) priv->wmm_enabled = true; else priv->wmm_enabled = false; priv->curr_bss_params.wmm_uapsd_enabled = false; if (priv->wmm_enabled) priv->curr_bss_params.wmm_uapsd_enabled = ((bss_desc->wmm_ie.qos_info_bitmap & IEEE80211_WMM_IE_AP_QOSINFO_UAPSD) ? 1 : 0); dev_dbg(priv->adapter->dev, "info: ASSOC_RESP: curr_pkt_filter is %#x\n", priv->curr_pkt_filter); if (priv->sec_info.wpa_enabled || priv->sec_info.wpa2_enabled) priv->wpa_is_gtk_set = false; if (priv->wmm_enabled) { /* Don't re-enable carrier until we get the WMM_GET_STATUS event */ enable_data = false; } else { /* Since WMM is not enabled, setup the queues with the defaults */ mwifiex_wmm_setup_queue_priorities(priv, NULL); mwifiex_wmm_setup_ac_downgrade(priv); } if (enable_data) dev_dbg(priv->adapter->dev, "info: post association, re-enabling data flow\n"); /* Reset SNR/NF/RSSI values */ priv->data_rssi_last = 0; priv->data_nf_last = 0; priv->data_rssi_avg = 0; priv->data_nf_avg = 0; priv->bcn_rssi_last = 0; priv->bcn_nf_last = 0; priv->bcn_rssi_avg = 0; priv->bcn_nf_avg = 0; priv->rxpd_rate = 0; priv->rxpd_htinfo = 0; mwifiex_save_curr_bcn(priv); priv->adapter->dbg.num_cmd_assoc_success++; dev_dbg(priv->adapter->dev, "info: ASSOC_RESP: associated\n"); /* Add the ra_list here for infra mode as there will be only 1 ra always */ mwifiex_ralist_add(priv, priv->curr_bss_params.bss_descriptor.mac_address); if (!netif_carrier_ok(priv->netdev)) netif_carrier_on(priv->netdev); mwifiex_wake_up_net_dev_queue(priv->netdev, adapter); if (priv->sec_info.wpa_enabled || priv->sec_info.wpa2_enabled) priv->scan_block = true; done: /* Need to indicate IOCTL complete */ if (adapter->curr_cmd->wait_q_enabled) { if (ret) adapter->cmd_wait_q.status = -1; else adapter->cmd_wait_q.status = 0; } return ret; }
/** * gether_connect - notify network layer that USB link is active * @link: the USB link, set up with endpoints, descriptors matching * current device speed, and any framing wrapper(s) set up. * Context: irqs blocked * * This is called to activate endpoints and let the network layer know * the connection is active ("carrier detect"). It may cause the I/O * queues to open and start letting network packets flow, but will in * any case activate the endpoints so that they respond properly to the * USB host. * * Verify net_device pointer returned using IS_ERR(). If it doesn't * indicate some error code (negative errno), ep->driver_data values * have been overwritten. */ struct net_device *gether_connect(struct gether *link) { struct eth_dev *dev = the_dev; int result = 0; if (!dev) return ERR_PTR(-EINVAL); link->in_ep->driver_data = dev; result = usb_ep_enable(link->in_ep, link->in); if (result != 0) { DBG(dev, "enable %s --> %d\n", link->in_ep->name, result); goto fail0; } link->out_ep->driver_data = dev; result = usb_ep_enable(link->out_ep, link->out); if (result != 0) { DBG(dev, "enable %s --> %d\n", link->out_ep->name, result); goto fail1; } if (result == 0) result = alloc_requests(dev, link, qlen(dev->gadget)); if (result == 0) { dev->zlp = link->is_zlp_ok; DBG(dev, "qlen %d\n", qlen(dev->gadget)); dev->header_len = link->header_len; dev->unwrap = link->unwrap; dev->wrap = link->wrap; spin_lock(&dev->lock); dev->port_usb = link; link->ioport = dev; if (netif_running(dev->net)) { if (link->open) link->open(link); } else { if (link->close) link->close(link); } spin_unlock(&dev->lock); netif_carrier_on(dev->net); if (netif_running(dev->net)) eth_start(dev, GFP_ATOMIC); /* on error, disable any endpoints */ } else { (void) usb_ep_disable(link->out_ep); fail1: (void) usb_ep_disable(link->in_ep); } fail0: /* caller is responsible for cleanup on error */ if (result < 0) return ERR_PTR(result); return dev->net; }
void ieee80211_wx_sync_scan_wq(struct work_struct *work) { struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); #else void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) { #endif short chan; HT_EXTCHNL_OFFSET chan_offset=0; HT_CHANNEL_WIDTH bandwidth=0; int b40M = 0; static int count = 0; chan = ieee->current_network.channel; netif_carrier_off(ieee->dev); if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); ieee80211_stop_send_beacons(ieee); ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); #ifndef RTL8192SE ieee->InitialGainHandler(ieee->dev,IG_Backup); #endif #if(RTL8192S_DISABLE_FW_DM == 0) if (ieee->SetFwCmdHandler) { ieee->SetFwCmdHandler(ieee->dev, FW_CMD_DIG_HALT); ieee->SetFwCmdHandler(ieee->dev, FW_CMD_HIGH_PWR_DISABLE); } #endif if (ieee->pHTInfo->bCurrentHTSupport && ieee->pHTInfo->bEnableHT && ieee->pHTInfo->bCurBW40MHz) { b40M = 1; chan_offset = ieee->pHTInfo->CurSTAExtChnlOffset; bandwidth = (HT_CHANNEL_WIDTH)ieee->pHTInfo->bCurBW40MHz; printk("Scan in 40M, force to 20M first:%d, %d\n", chan_offset, bandwidth); ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT); } ieee80211_start_scan_syncro(ieee); if (b40M) { printk("Scan in 20M, back to 40M\n"); if (chan_offset == HT_EXTCHNL_OFFSET_UPPER) ieee->set_chan(ieee->dev, chan + 2); else if (chan_offset == HT_EXTCHNL_OFFSET_LOWER) ieee->set_chan(ieee->dev, chan - 2); else ieee->set_chan(ieee->dev, chan); ieee->SetBWModeHandler(ieee->dev, bandwidth, chan_offset); } else { ieee->set_chan(ieee->dev, chan); } #ifndef RTL8192SE ieee->InitialGainHandler(ieee->dev,IG_Restore); #endif #if(RTL8192S_DISABLE_FW_DM == 0) if (ieee->SetFwCmdHandler) { ieee->SetFwCmdHandler(ieee->dev, FW_CMD_DIG_RESUME); ieee->SetFwCmdHandler(ieee->dev, FW_CMD_HIGH_PWR_ENABLE); } #endif ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); // To prevent the immediately calling watch_dog after scan. if(ieee->LinkDetectInfo.NumRecvBcnInPeriod==0||ieee->LinkDetectInfo.NumRecvDataInPeriod==0 ) { ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1; ieee->LinkDetectInfo.NumRecvDataInPeriod= 1; } if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) ieee80211_start_send_beacons(ieee); netif_carrier_on(ieee->dev); count = 0; up(&ieee->wx_sem); }