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); |
} |
} |
|
|