/** * @brief Set/Get radio * * @param dev A pointer to net_device structure * @param req A pointer to ifreq structure * * @return 0 --success, otherwise fail */ static int woal_uap_radio_ctl(struct net_device *dev, struct ifreq *req) { moal_private *priv = (moal_private *) netdev_priv(dev); int ret = 0; mlan_ds_radio_cfg *radio = NULL; mlan_ioctl_req *mreq = NULL; int data[2] = { 0, 0 }; mlan_bss_info bss_info; ENTER(); /* Sanity check */ if (req->ifr_data == NULL) { PRINTM(MERROR, "uap_radio_ctl() corrupt data\n"); ret = -EFAULT; goto done; } /* Get user data */ if (copy_from_user(&data, req->ifr_data, sizeof(data))) { PRINTM(MERROR, "Copy from user failed\n"); ret = -EFAULT; goto done; } if (data[0]) { mreq = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_radio_cfg)); if (mreq == NULL) { ret = -ENOMEM; goto done; } radio = (mlan_ds_radio_cfg *) mreq->pbuf; radio->sub_command = MLAN_OID_RADIO_CTRL; mreq->req_id = MLAN_IOCTL_RADIO_CFG; mreq->action = MLAN_ACT_SET; radio->param.radio_on_off = (t_u32) data[1]; if (MLAN_STATUS_SUCCESS != woal_request_ioctl(priv, mreq, MOAL_IOCTL_WAIT)) { ret = -EFAULT; } if (mreq) kfree(mreq); } else { /* Get radio status */ memset(&bss_info, 0, sizeof(bss_info)); woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info); data[1] = bss_info.radio_on; if (copy_to_user(req->ifr_data, data, sizeof(data))) { PRINTM(MERROR, "Copy to user failed\n"); ret = -EFAULT; } } done: LEAVE(); return ret; }
/** * @brief Proc read function for info * * @param page Pointer to buffer * @param start Read data starting position * @param offset Offset * @param count Counter * @param eof End of file flag * @param data Data to output * * @return Number of output data */ static int woal_info_proc_read(char *page, char **start, off_t offset, int count, int *eof, void *data) { char *p = page; struct net_device *netdev = data; char fmt[64]; moal_private *priv = (moal_private *) netdev_priv(netdev); #ifdef STA_SUPPORT int i = 0; moal_handle *handle = priv->phandle; mlan_bss_info info; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) struct dev_mc_list *mcptr = netdev->mc_list; int mc_count = netdev->mc_count; #else struct netdev_hw_addr *mcptr = NULL; int mc_count = netdev_mc_count(netdev); #endif /* < 2.6.35 */ #endif #ifdef UAP_SUPPORT mlan_ds_uap_stats ustats; #endif if (offset) { *eof = 1; goto exit; } #ifdef UAP_SUPPORT if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) { p += sprintf(p, "driver_name = " "\"uap\"\n"); woal_uap_get_version(priv, fmt, sizeof(fmt) - 1); if (MLAN_STATUS_SUCCESS != woal_uap_get_stats(priv, MOAL_PROC_WAIT, &ustats)) { *eof = 1; goto exit; } } #endif /* UAP_SUPPORT */ #ifdef STA_SUPPORT if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) { woal_get_version(handle, fmt, sizeof(fmt) - 1); memset(&info, 0, sizeof(info)); if (MLAN_STATUS_SUCCESS != woal_get_bss_info(priv, MOAL_PROC_WAIT, &info)) { *eof = 1; goto exit; } p += sprintf(p, "driver_name = " "\"wlan\"\n"); } #endif p += sprintf(p, "driver_version = %s", fmt); p += sprintf(p, "\ninterface_name=\"%s\"\n", netdev->name); #ifdef STA_SUPPORT if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) p += sprintf(p, "bss_mode=\"%s\"\n", szModes[info.bss_mode]); #endif p += sprintf(p, "media_state=\"%s\"\n", ((priv->media_connected == MFALSE) ? "Disconnected" : "Connected")); p += sprintf(p, "mac_address=\"%02x:%02x:%02x:%02x:%02x:%02x\"\n", netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2], netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]); #ifdef STA_SUPPORT if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) { p += sprintf(p, "multicast_count=\"%d\"\n", mc_count); p += sprintf(p, "essid=\"%s\"\n", info.ssid.ssid); p += sprintf(p, "bssid=\"%02x:%02x:%02x:%02x:%02x:%02x\"\n", info.bssid[0], info.bssid[1], info.bssid[2], info.bssid[3], info.bssid[4], info.bssid[5]); p += sprintf(p, "channel=\"%d\"\n", (int) info.bss_chan); p += sprintf(p, "region_code = \"%02x\"\n", (t_u8) info.region_code); /* * Put out the multicast list */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) for (i = 0; i < netdev->mc_count; i++) { p += sprintf(p, "multicast_address[%d]=\"%02x:%02x:%02x:%02x:%02x:%02x\"\n", i, mcptr->dmi_addr[0], mcptr->dmi_addr[1], mcptr->dmi_addr[2], mcptr->dmi_addr[3], mcptr->dmi_addr[4], mcptr->dmi_addr[5]); mcptr = mcptr->next; } #else netdev_for_each_mc_addr(mcptr, netdev) p += sprintf(p, "multicast_address[%d]=\"%02x:%02x:%02x:%02x:%02x:%02x\"\n", i++, mcptr->addr[0], mcptr->addr[1], mcptr->addr[2], mcptr->addr[3], mcptr->addr[4], mcptr->addr[5]); #endif /* < 2.6.35 */ } #endif p += sprintf(p, "num_tx_bytes = %lu\n", priv->stats.tx_bytes); p += sprintf(p, "num_rx_bytes = %lu\n", priv->stats.rx_bytes); p += sprintf(p, "num_tx_pkts = %lu\n", priv->stats.tx_packets); p += sprintf(p, "num_rx_pkts = %lu\n", priv->stats.rx_packets); p += sprintf(p, "num_tx_pkts_dropped = %lu\n", priv->stats.tx_dropped); p += sprintf(p, "num_rx_pkts_dropped = %lu\n", priv->stats.rx_dropped); p += sprintf(p, "num_tx_pkts_err = %lu\n", priv->stats.tx_errors); p += sprintf(p, "num_rx_pkts_err = %lu\n", priv->stats.rx_errors); p += sprintf(p, "carrier %s\n", ((netif_carrier_ok(priv->netdev)) ? "on" : "off")); p += sprintf(p, "tx queue %s\n", ((netif_queue_stopped(priv->netdev)) ? "stopped" : "started")); #ifdef UAP_SUPPORT if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) { p += sprintf(p, "tkip_mic_failures = %lu\n", ustats.tkip_mic_failures); p += sprintf(p, "ccmp_decrypt_errors = %lu\n", ustats.ccmp_decrypt_errors); p += sprintf(p, "wep_undecryptable_count = %lu\n", ustats.wep_undecryptable_count); p += sprintf(p, "wep_icv_error_count = %lu\n", ustats.wep_icv_error_count); p += sprintf(p, "decrypt_failure_count = %lu\n", ustats.decrypt_failure_count); p += sprintf(p, "mcast_tx_count = %lu\n", ustats.mcast_tx_count); p += sprintf(p, "failed_count = %lu\n", ustats.failed_count); p += sprintf(p, "retry_count = %lu\n", ustats.retry_count); p += sprintf(p, "multiple_retry_count = %lu\n", ustats.multi_retry_count); p += sprintf(p, "frame_duplicate_count = %lu\n", ustats.frame_dup_count); p += sprintf(p, "rts_success_count = %lu\n", ustats.rts_success_count); p += sprintf(p, "rts_failure_count = %lu\n", ustats.rts_failure_count); p += sprintf(p, "ack_failure_count = %lu\n", ustats.ack_failure_count); p += sprintf(p, "rx_fragment_count = %lu\n", ustats.rx_fragment_count); p += sprintf(p, "mcast_rx_frame_count = %lu\n", ustats.mcast_rx_frame_count); p += sprintf(p, "fcs_error_count = %lu\n", ustats.fcs_error_count); p += sprintf(p, "tx_frame_count = %lu\n", ustats.tx_frame_count); p += sprintf(p, "rsna_tkip_cm_invoked = %lu\n", ustats.rsna_tkip_cm_invoked); p += sprintf(p, "rsna_4way_hshk_failures = %lu\n", ustats.rsna_4way_hshk_failures); } #endif /* UAP_SUPPORT */ exit: return (p - page); }