Diff for /embedtools/src/athctl.c between versions 1.1.2.3 and 1.1.2.4

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

Removed from v.1.1.2.3  
changed lines
  Added in v.1.1.2.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>