From 4bd43f507c7e2f225f58235226a8381fd6bbff1a Mon Sep 17 00:00:00 2001 From: "Luis R. Rodriguez" Date: Mon, 27 Oct 2008 22:44:22 -0700 Subject: Staging: add otus Atheros wireless network driver Initial dump of the otus USB wireless network driver. It builds properly, but a lot of work needs to be done cleaning it up before it can be merged into the wireless driver tree. Signed-off-by: Luis R. Rodriguez Signed-off-by: Greg Kroah-Hartman --- drivers/staging/otus/apdbg.c | 457 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 457 insertions(+) create mode 100644 drivers/staging/otus/apdbg.c (limited to 'drivers/staging/otus/apdbg.c') diff --git a/drivers/staging/otus/apdbg.c b/drivers/staging/otus/apdbg.c new file mode 100644 index 00000000000..d3e2f622419 --- /dev/null +++ b/drivers/staging/otus/apdbg.c @@ -0,0 +1,457 @@ +/* + * Copyright (c) 2007-2008 Atheros Communications Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* */ +/* Module Name : apdbg.c */ +/* */ +/* Abstract */ +/* Debug tools */ +/* */ +/* NOTES */ +/* None */ +/* */ +/************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define ZM_IOCTL_REG_READ 0x01 +#define ZM_IOCTL_REG_WRITE 0x02 +#define ZM_IOCTL_MEM_DUMP 0x03 +#define ZM_IOCTL_REG_DUMP 0x05 +#define ZM_IOCTL_TXD_DUMP 0x06 +#define ZM_IOCTL_RXD_DUMP 0x07 +#define ZM_IOCTL_MEM_READ 0x0B +#define ZM_IOCTL_MEM_WRITE 0x0C +#define ZM_IOCTL_DMA_TEST 0x10 +#define ZM_IOCTL_REG_TEST 0x11 +#define ZM_IOCTL_TEST 0x80 +#define ZM_IOCTL_TALLY 0x81 //CWYang(+) +#define ZM_IOCTL_RTS 0xA0 +#define ZM_IOCTL_MIX_MODE 0xA1 +#define ZM_IOCTL_FRAG 0xA2 +#define ZM_IOCTL_SCAN 0xA3 +#define ZM_IOCTL_KEY 0xA4 +#define ZM_IOCTL_RATE 0xA5 +#define ZM_IOCTL_ENCRYPTION_MODE 0xA6 +#define ZM_IOCTL_GET_TXCNT 0xA7 +#define ZM_IOCTL_GET_DEAGG_CNT 0xA8 +#define ZM_IOCTL_DURATION_MODE 0xA9 +#define ZM_IOCTL_SET_AES_KEY 0xAA +#define ZM_IOCTL_SET_AES_MODE 0xAB +#define ZM_IOCTL_SIGNAL_STRENGTH 0xAC //CWYang(+) +#define ZM_IOCTL_SIGNAL_QUALITY 0xAD //CWYang(+) +#define ZM_IOCTL_SET_PIBSS_MODE 0xAE +#define ZDAPIOCTL SIOCDEVPRIVATE + +struct zdap_ioctl { + unsigned short cmd; /* Command to run */ + unsigned int addr; /* Length of the data buffer */ + unsigned int value; /* Pointer to the data buffer */ + unsigned char data[0x100]; +}; + +/* Declaration of macro and function for handling WEP Keys */ + +#if 0 + +#define SKIP_ELEM { \ + while(isxdigit(*p)) \ + p++; \ +} + +#define SKIP_DELIMETER { \ + if(*p == ':' || *p == ' ') \ + p++; \ +} + +#endif + +char hex(char); +unsigned char asctohex(char *str); + +char *prgname; + +int set_ioctl(int sock, struct ifreq *req) +{ + if (ioctl(sock, ZDAPIOCTL, req) < 0) { + fprintf(stderr, "%s: ioctl(SIOCGIFMAP): %s\n", + prgname, strerror(errno)); + return -1; + } + + return 0; +} + + +int read_reg(int sock, struct ifreq *req) +{ + struct zdap_ioctl *zdreq = 0; + + if (!set_ioctl(sock, req)) + return -1; + + //zdreq = (struct zdap_ioctl *)req->ifr_data; + //printf( "reg = %4x, value = %4x\n", zdreq->addr, zdreq->value); + + return 0; +} + + +int read_mem(int sock, struct ifreq *req) +{ + struct zdap_ioctl *zdreq = 0; + int i; + + if (!set_ioctl(sock, req)) + return -1; + + /*zdreq = (struct zdap_ioctl *)req->ifr_data; + printf( "dump mem from %x, length = %x\n", zdreq->addr, zdreq->value); + + for (i=0; ivalue; i++) { + printf("%02x", zdreq->data[i]); + printf(" "); + + if ((i>0) && ((i+1)%16 == 0)) + printf("\n"); + }*/ + + return 0; +} + + +int main(int argc, char **argv) +{ + int sock; + int addr, value; + struct ifreq req; + char *action = NULL; + struct zdap_ioctl zdreq; + + prgname = argv[0]; + + if (argc < 3) { + fprintf(stderr,"%s: usage is \"%s [
] []\"\n", + prgname, prgname); + fprintf(stderr,"valid operation: read, write, mem, reg,\n"); + fprintf(stderr," : txd, rxd, rmem, wmem\n"); + fprintf(stderr," : dmat, regt, test\n"); + + fprintf(stderr," scan, Channel Scan\n"); + fprintf(stderr," rts , Set RTS Threshold\n"); + fprintf(stderr," frag , Set Fragment Threshold\n"); + fprintf(stderr," rate <0-28>, 0:AUTO, 1-4:CCK, 5-12:OFDM, 13-28:HT\n"); + fprintf(stderr," TBD mix <0 or 1>, Set 1 to enable mixed mode\n"); + fprintf(stderr," enc, <0-3>, 0=>OPEN, 1=>WEP64, 2=>WEP128, 3=>WEP256\n"); + fprintf(stderr," skey , Set WEP key\n"); + fprintf(stderr," txcnt, Get TxQ Cnt\n"); + fprintf(stderr," dagcnt, Get Deaggregate Cnt\n"); + fprintf(stderr," durmode , Set Duration Mode 0=>HW, 1=>SW\n"); + fprintf(stderr," aeskey \n"); + fprintf(stderr," aesmode \n"); + fprintf(stderr," wlanmode <0,1> 0:Station mode, 1:PIBSS mode\n"); + fprintf(stderr," tal <0,1>, Get Current Tally Info, 0=>read, 1=>read and reset\n"); + + exit(1); + } + + strcpy(req.ifr_name, argv[1]); + zdreq.addr = 0; + zdreq.value = 0; + + /* a silly raw socket just for ioctl()ling it */ + sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); + if (sock < 0) { + fprintf(stderr, "%s: socket(): %s\n", argv[0], strerror(errno)); + exit(1); + } + + if (argc >= 4) + { + sscanf(argv[3], "%x", &addr); + } + + if (argc >= 5) + { + sscanf(argv[4], "%x", &value); + } + + zdreq.addr = addr; + zdreq.value = value; + + if (!strcmp(argv[2], "read")) + { + zdreq.cmd = ZM_IOCTL_REG_READ; + } + else if (!strcmp(argv[2], "mem")) + { + zdreq.cmd = ZM_IOCTL_MEM_DUMP; + } + else if (!strcmp(argv[2], "write")) + { + zdreq.cmd = ZM_IOCTL_REG_WRITE; + } + else if (!strcmp(argv[2], "reg")) + { + zdreq.cmd = ZM_IOCTL_REG_DUMP; + } + else if (!strcmp(argv[2], "txd")) + { + zdreq.cmd = ZM_IOCTL_TXD_DUMP; + } + else if (!strcmp(argv[2], "rxd")) + { + zdreq.cmd = ZM_IOCTL_RXD_DUMP; + } + else if (!strcmp(argv[2], "rmem")) + { + zdreq.cmd = ZM_IOCTL_MEM_READ; + } + else if (!strcmp(argv[2], "wmem")) + { + zdreq.cmd = ZM_IOCTL_MEM_WRITE; + } + else if (!strcmp(argv[2], "dmat")) + { + zdreq.cmd = ZM_IOCTL_DMA_TEST; + } + else if (!strcmp(argv[2], "regt")) + { + zdreq.cmd = ZM_IOCTL_REG_TEST; + } + else if (!strcmp(argv[2], "test")) + { + zdreq.cmd = ZM_IOCTL_TEST; + } + else if (!strcmp(argv[2], "tal")) + { + sscanf(argv[3], "%d", &addr); + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_TALLY; + } + else if (!strcmp(argv[2], "rts")) + { + sscanf(argv[3], "%d", &addr); + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_RTS; + } + else if (!strcmp(argv[2], "mix")) + { + zdreq.cmd = ZM_IOCTL_MIX_MODE; + } + else if (!strcmp(argv[2], "frag")) + { + sscanf(argv[3], "%d", &addr); + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_FRAG; + } + else if (!strcmp(argv[2], "scan")) + { + zdreq.cmd = ZM_IOCTL_SCAN; + } + else if (!strcmp(argv[2], "skey")) + { + zdreq.cmd = ZM_IOCTL_KEY; + + if (argc >= 4) + { + unsigned char temp[29]; + int i; + int keyLen; + int encType; + + keyLen = strlen(argv[3]); + + if (keyLen == 10) + { + sscanf(argv[3], "%02x%02x%02x%02x%02x", &temp[0], &temp[1], + &temp[2], &temp[3], &temp[4]); + } + else if (keyLen == 26) + { + sscanf(argv[3], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], + &temp[5], &temp[6], &temp[7], &temp[8], &temp[9], + &temp[10], &temp[11], &temp[12]); + } + else if (keyLen == 58) + { + sscanf(argv[3], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], + &temp[5], &temp[6], &temp[7], &temp[8], &temp[9], + &temp[10], &temp[11], &temp[12], &temp[13], &temp[14], + &temp[15], &temp[16], &temp[17], &temp[18], &temp[19], + &temp[20], &temp[21], &temp[22], &temp[23], &temp[24], + &temp[25], &temp[26], &temp[27], &temp[28]); + } + else + { + fprintf(stderr, "Invalid key length\n"); + exit(1); + } + zdreq.addr = keyLen/2; + + for(i=0; i 28) + { + fprintf(stderr, "Invalid rate, range:0~28\n"); + exit(1); + } + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_RATE; + } + else if (!strcmp(argv[2], "enc")) + { + sscanf(argv[3], "%d", &addr); + + if (addr > 3) + { + fprintf(stderr, "Invalid encryption mode, range:0~3\n"); + exit(1); + } + + if (addr == 2) + { + addr = 5; + } + else if (addr == 3) + { + addr = 6; + } + + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_ENCRYPTION_MODE; + } + else if (!strcmp(argv[2], "txcnt")) + { + zdreq.cmd = ZM_IOCTL_GET_TXCNT; + } + else if (!strcmp(argv[2], "dagcnt")) + { + sscanf(argv[3], "%d", &addr); + + if (addr != 0 && addr != 1) + { + fprintf(stderr, "The value should be 0 or 1\n"); + exit(0); + } + + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_GET_DEAGG_CNT; + } + else if (!strcmp(argv[2], "durmode")) + { + sscanf(argv[3], "%d", &addr); + + if (addr != 0 && addr != 1) + { + fprintf(stderr, "The Duration mode should be 0 or 1\n"); + exit(0); + } + + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_DURATION_MODE; + } + else if (!strcmp(argv[2], "aeskey")) + { + unsigned char temp[16]; + int i; + + sscanf(argv[3], "%d", &addr); + + sscanf(argv[4], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5], &temp[6], &temp[7], &temp[8], &temp[9], &temp[10], &temp[11], &temp[12], &temp[13], &temp[14], &temp[15]); + + for(i = 0; i < 16; i++) + { + zdreq.data[i] = temp[i]; + } + + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_SET_AES_KEY; + } + else if (!strcmp(argv[2], "aesmode")) + { + sscanf(argv[3], "%d", &addr); + + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_SET_AES_MODE; + } + else if (!strcmp(argv[2], "wlanmode")) + { + sscanf(argv[3], "%d", &addr); + + zdreq.addr = addr; + zdreq.cmd = ZM_IOCTL_SET_PIBSS_MODE; + } + else + { + fprintf(stderr, "error action\n"); + exit(1); + } + + req.ifr_data = (char *)&zdreq; + set_ioctl(sock, &req); + +fail: + exit(0); +} + +unsigned char asctohex(char *str) +{ + unsigned char value; + + value = hex(*str) & 0x0f; + value = value << 4; + str++; + value |= hex(*str) & 0x0f; + + return value; +} + +char hex(char v) +{ + if(isdigit(v)) + return v - '0'; + else if(isxdigit(v)) + return (tolower(v) - 'a' + 10); + else + return 0; +} + -- cgit v1.2.3