|
|
| version 1.1.2.3, 2010/10/25 12:56:27 | version 1.1.2.4, 2010/10/25 14:46:30 |
|---|---|
| Line 19 Usage() | Line 19 Usage() |
| { | { |
| printf( "athCtl is tool for Atheros WiFi cards managment \n" | printf( "athCtl is tool for Atheros WiFi cards managment \n" |
| "=== %s === %s@%s ===\n\n" | "=== %s === %s@%s ===\n\n" |
| " Syntax: athctl [options] [0xMemory_Address]\n" | " Syntax: athctl [options] [[0xMemory_Address] new_value]\n" |
| " athctl [-v] -t [-i <iface_no>]\n" | " athctl [-v] -t [-i <iface_no>]\n" |
| " athctl [-v] -c <timeout> [-i <iface_no>]\n" | " athctl [-v] -c <timeout> [-i <iface_no>]\n" |
| " athctl [-v] -d <distance> [-i <iface_no>]\n" | " athctl [-v] -d <distance> [-i <iface_no>]\n" |
| " athctl [-v] -r <0xoffset> <0xMemory_Address>\n" | " athctl [-v] -r <0xoffset> <0xMemory_Address>\n" |
| " athctl [-v] -w <0xoffset> <0xMemory_Address>\n" | " athctl [-v] -w <0xoffset> <0xMemory_Address> <uint16_value>\n" |
| " athctl [-v] -s <file> <0xMemory_Address>\n" | " athctl [-v] -s <file> <0xMemory_Address>\n" |
| " athctl [-v] -w <file> <0xMemory_Address>\n" | " athctl [-v] -w <file> <0xMemory_Address>\n" |
| "\n" | "\n" |
| Line 170 devClose(void *basemem) | Line 170 devClose(void *basemem) |
| munmap(basemem, ATH_PCI_MEM_SIZE); | munmap(basemem, ATH_PCI_MEM_SIZE); |
| } | } |
| static inline short | |
| readWord(u_char *mem, u_long offset) | |
| { | |
| register int timeout = ATH_ACCESS_TIMEOUT; | |
| u_long stat; | |
| ATH_OUT(mem, AR5211_EEPROM_CONF, 0); | |
| usleep(ATH_ACCESS_WAIT); | |
| /* enable eeprom access */ | |
| ATH_OUT(mem, AR5211_EEPROM_COMD, ATH_IN(mem, AR5211_EEPROM_COMD) | AR5211_EEPROM_COMD_RESET); | |
| usleep(ATH_ACCESS_WAIT); | |
| /* set address */ | |
| ATH_OUT(mem, AR5211_EEPROM_ADDR, offset); | |
| usleep(ATH_ACCESS_WAIT); | |
| /* enable eeprom read access */ | |
| ATH_OUT(mem, AR5211_EEPROM_COMD, ATH_IN(mem, AR5211_EEPROM_COMD) | AR5211_EEPROM_COMD_READ); | |
| usleep(ATH_ACCESS_WAIT); | |
| while (timeout--) { | |
| usleep(1); | |
| stat = ATH_IN(mem, AR5211_EEPROM_STATUS); | |
| if (stat & AR5211_EEPROM_STAT_RDDONE) { | |
| if (stat & AR5211_EEPROM_STAT_RDERR) { | |
| printf("Error:: EEPROM read failed!\n"); | |
| return -1; | |
| } | |
| stat = ATH_IN(mem, AR5211_EEPROM_DATA); | |
| return stat & 0x0000ffff; | |
| } | |
| } | |
| printf("Error:: EEPROM read timeout!\n"); | |
| return 0; | |
| } | |
| static inline short | |
| writeWord(u_char *mem, u_long offset, u_short newval) | |
| { | |
| register int i = ATH_WRITE_RETRY, timeout; | |
| u_long pcicfg, stat; | |
| u_short chk; | |
| /* enable pci write access */ | |
| pcicfg = ATH_IN(mem, AR5K_PCICFG); | |
| ATH_OUT(mem, AR5K_PCICFG, (pcicfg & ~AR5K_PCICFG_SPWR_DN)); | |
| usleep(ATH_ACCESS_WAITDOWN); | |
| ATH_OUT(mem, AR5K_PCICFG, pcicfg | AR5K_PCICFG_EEAE /* | 0x2 */); | |
| usleep(ATH_ACCESS_WAITPCI); | |
| ATH_OUT(mem, AR5211_EEPROM_STATUS, 0); | |
| usleep(ATH_ACCESS_WAITPCI); | |
| /* ATH_OUT(mem, AR5211_EEPROM_CONF, 1); */ | |
| ATH_OUT(mem, AR5211_EEPROM_CONF, 0); | |
| do { | |
| /* enable eeprom write access */ | |
| ATH_OUT(mem, AR5211_EEPROM_COMD, AR5211_EEPROM_COMD_RESET); | |
| usleep(ATH_ACCESS_WAITDOWN); | |
| ATH_OUT(mem, AR5211_EEPROM_DATA, newval); | |
| usleep(ATH_ACCESS_WAIT); | |
| ATH_OUT(mem, AR5211_EEPROM_ADDR, offset); | |
| usleep(ATH_ACCESS_WAIT); | |
| ATH_OUT(mem, AR5211_EEPROM_COMD, AR5211_EEPROM_COMD_WRITE); | |
| usleep(ATH_ACCESS_WAIT); | |
| for (timeout = ATH_ACCESS_TIMEOUT; timeout; timeout--) { | |
| stat = ATH_IN(mem, AR5211_EEPROM_STATUS); | |
| if (stat & 0xc) { | |
| if (stat & AR5211_EEPROM_STAT_WRERR) { | |
| printf("Error:: EEPROM write failed!\n"); | |
| return -1; | |
| } | |
| ATH_OUT(mem, AR5211_EEPROM_STATUS, 0); | |
| usleep(ATH_ACCESS_WAIT * 2); | |
| break; | |
| } | |
| usleep(ATH_ACCESS_WAIT * 2); | |
| } | |
| chk = readWord(mem, offset); | |
| if (chk == (u_short) -1) | |
| return -1; | |
| if (chk == newval) | |
| return 1; | |
| if (i) | |
| printf("Warning:: Retrying EEPROM write ...\n"); | |
| } while (--i); | |
| printf("Error:: EEPROM write timeout!\n"); | |
| return 0; | |
| } | |
| /* | /* |
| static int | static int |
| readEEPROM() | readEEPROM() |
| Line 189 main(int argc, char **argv) | Line 282 main(int argc, char **argv) |
| { | { |
| char ch, szName[MAXPATHLEN] = { 0 }, mode = 0; | char ch, szName[MAXPATHLEN] = { 0 }, mode = 0; |
| int ret = 0, dist = 0, cor = 0, ino = 0; | int ret = 0, dist = 0, cor = 0, ino = 0; |
| u_long offset, baseaddr = (u_long) -1; | u_long offset = 0, baseaddr = (u_long) -1; |
| u_short newval = 0; | |
| void *basemem = NULL; | void *basemem = NULL; |
| while ((ch = getopt(argc, argv, "hvtr:w:i:d:c:u:s:")) != -1) | while ((ch = getopt(argc, argv, "hvtr:w:i:d:c:u:s:")) != -1) |
| Line 252 main(int argc, char **argv) | Line 346 main(int argc, char **argv) |
| printf("Error:: in this mode for operation, must give memory mapped address ...\n"); | printf("Error:: in this mode for operation, must give memory mapped address ...\n"); |
| return 1; | return 1; |
| } | } |
| if (mode & 8) { | |
| if (!argv[1]) { | |
| printf("Error:: in write word mode, must give memory mapped address and new value ...\n"); | |
| return 1; | |
| } else | |
| newval = (u_short) strtoul(argv[1], NULL, 0); | |
| } | |
| if (mode & 1) | if (mode & 1) |
| if ((ret = calcDistance(ino, dist, cor)) < 1) | if ((ret = calcDistance(ino, dist, cor)) < 1) |
| Line 270 main(int argc, char **argv) | Line 371 main(int argc, char **argv) |
| if (mode & 4) { | if (mode & 4) { |
| if (!(basemem = devOpen(baseaddr))) | if (!(basemem = devOpen(baseaddr))) |
| return 2; | return 2; |
| // if ((ret = readWord(basemem)) < 1) | if ((ret = readWord(basemem, offset)) < 1) { |
| // return 3; | devClose(basemem); |
| return 3; | |
| } | |
| devClose(basemem); | |
| } | |
| if (mode & 8) { | |
| if (!(basemem = devOpen(baseaddr))) | |
| return 2; | |
| if ((ret = writeWord(basemem, offset, newval)) < 1) { | |
| devClose(basemem); | |
| return 3; | |
| } | |
| devClose(basemem); | devClose(basemem); |
| } | } |