/** * @brief vendor command to set drvdbg * * @param wiphy A pointer to wiphy struct * @param wdev A pointer to wireless_dev struct * @param data a pointer to data * @param len data length * * @return 0: success 1: fail */ static int woal_cfg80211_subcmd_set_drvdbg(struct wiphy *wiphy, struct wireless_dev *wdev, const void *data, int data_len) { struct net_device *dev = wdev->netdev; moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); struct sk_buff *skb = NULL; t_u8 *pos = NULL; int ret = 0; ENTER(); /**handle this sub command*/ DBG_HEXDUMP(MCMD_D, "Vendor drvdbg", (t_u8 *)data, data_len); if (data_len) { /* Get the driver debug bit masks from user */ drvdbg = *((t_u32 *)data); PRINTM(MIOCTL, "new drvdbg %x\n", drvdbg); /* Set the driver debug bit masks into mlan */ if (woal_set_drvdbg(priv, drvdbg)) { PRINTM(MERROR, "Set drvdbg failed!\n"); ret = 1; } } /** Allocate skb for cmd reply*/ skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(drvdbg)); if (!skb) { PRINTM(MERROR, "allocate memory fail for vendor cmd\n"); ret = 1; LEAVE(); return ret; } pos = skb_put(skb, sizeof(drvdbg)); memcpy(pos, &drvdbg, sizeof(drvdbg)); ret = cfg80211_vendor_cmd_reply(skb); LEAVE(); return ret; }
/** * @brief Proc write function * * @param f File pointer * @param buf Pointer to data buffer * @param cnt Data number to write * @param data Data to write * * @return Number of data or MLAN_STATUS_FAILURE */ static int woal_debug_write(struct file *f, const char *buf, unsigned long cnt, void *data) { int r, i; char *pdata; char *p; char *p0; char *p1; char *p2; struct debug_data *d = ((struct debug_data_priv *) data)->items; moal_private *priv = ((struct debug_data_priv *) data)->priv; #ifdef DEBUG_LEVEL1 t_u32 last_drvdbg = drvdbg; #endif ENTER(); if (MODULE_GET == 0) { LEAVE(); return MLAN_STATUS_FAILURE; } pdata = (char *) kmalloc(cnt, GFP_KERNEL); if (pdata == NULL) { MODULE_PUT; LEAVE(); return 0; } if (copy_from_user(pdata, buf, cnt)) { PRINTM(MERROR, "Copy from user failed\n"); kfree(pdata); MODULE_PUT; LEAVE(); return 0; } if (woal_get_debug_info(priv, MOAL_PROC_WAIT, &info)) { kfree(pdata); MODULE_PUT; LEAVE(); return 0; } p0 = pdata; for (i = 0; i < ((struct debug_data_priv *) data)->num_of_items; i++) { do { p = strstr(p0, d[i].name); if (p == NULL) break; p1 = strchr(p, '\n'); if (p1 == NULL) break; p0 = p1++; p2 = strchr(p, '='); if (!p2) break; p2++; r = woal_string_to_number(p2); if (d[i].size == 1) *((t_u8 *) d[i].addr) = (t_u8) r; else if (d[i].size == 2) *((t_u16 *) d[i].addr) = (t_u16) r; else if (d[i].size == 4) *((t_ptr *) d[i].addr) = (t_ptr) r; break; } while (MTRUE); } kfree(pdata); #ifdef DEBUG_LEVEL1 if (last_drvdbg != drvdbg) { woal_set_drvdbg(priv, drvdbg); } #endif /* Set debug information */ if (woal_set_debug_info(priv, MOAL_PROC_WAIT, &info)) { MODULE_PUT; LEAVE(); return 0; } MODULE_PUT; LEAVE(); return cnt; }