Show
Ignore:
Timestamp:
09/19/01 19:57:11 (13 years ago)
Author:
mds
Message:

Loop waiting for un-busy at start of transaction.

Fail and printk if still busy.
Fail and printk if completion timeout at end of transaction.
Reduce timeout from 5 sec to 1 sec.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/kernel/busses/i2c-amd756.c

    r1154 r1190  
    8080 
    8181/* Other settings */ 
    82 #define MAX_TIMEOUT 500 
     82#define MAX_TIMEOUT 100 
    8383 
    8484/* AMD756 constants */ 
     
    145145int amd756_setup(void) 
    146146{ 
    147         int error_return = 0; 
    148147        unsigned char temp; 
    149148        int *num = supported; 
    150149        struct pci_dev *AMD756_dev = NULL; 
    151150 
    152         /* First check whether we can access PCI at all */ 
    153151        if (pci_present() == 0) { 
    154152                printk("i2c-amd756.o: Error: No PCI-bus found!\n"); 
     
    178176        if ((temp & 128) == 0) { 
    179177                printk 
    180                     ("SMBUS: Error: Host SMBus controller I/O not enabled!\n"); 
     178                  ("i2c-amd756.o: Error: SMBus controller I/O not enabled!\n"); 
    181179                return(-ENODEV); 
    182180        } 
     
    190188        if (check_region(amd756_smba, SMB_IOSIZE)) { 
    191189                printk 
    192                     ("i2c-amd756.o: AMD756_smb region 0x%x already in use!\n", 
     190                    ("i2c-amd756.o: SMB region 0x%x already in use!\n", 
    193191                     amd756_smba); 
    194192                return(-ENODEV); 
     
    199197 
    200198#ifdef DEBUG 
    201         /* 
    202            if ((temp & 0x0E) == 8) 
    203            printk("i2c-amd756.o: AMD756 using Interrupt 9 for SMBus.\n"); 
    204            else if ((temp & 0x0E) == 0) 
    205            printk("i2c-amd756.o: AMD756 using Interrupt SMI# for SMBus.\n"); 
    206            else  
    207            printk("i2c-amd756.o: AMD756: Illegal Interrupt configuration (or code out " 
    208            "of date)!\n"); 
    209          */ 
    210  
    211199        pci_read_config_byte(AMD756_dev, SMBREV, &temp); 
    212200        printk("i2c-amd756.o: SMBREV = 0x%X\n", temp); 
     
    236224#define GS_HCYC_STS (1 << 4) 
    237225#define GS_TO_STS (1 << 5) 
     226#define GS_SMB_STS (1 << 11) 
    238227 
    239228#define GS_CLEAR_STS (GS_ABRT_STS | GS_COL_STS | GS_PRERR_STS | \ 
     
    243232#define GE_HOST_STC (1 << 3) 
    244233 
    245 /* Another internally used function */ 
    246234int amd756_transaction(void) 
    247235{ 
     
    258246 
    259247        /* Make sure the SMBus host is ready to start transmitting */ 
    260         /* TODO: What about SM_BSY? */ 
    261         if (((temp = inw_p(SMB_GLOBAL_STATUS)) & GS_HST_STS) != 0x00) { 
    262 #ifdef DEBUG 
    263                 printk 
    264                     ("i2c-amd756.o: SMBus busy (%04x). Resetting (NOT)... \n", 
    265                      temp); 
    266 #endif 
    267                 /* TODO: How to reset the AMD? 
    268                    outb_p(temp, SMBHSTSTS); 
    269                  */ 
    270                 if (((temp = inw_p(SMB_GLOBAL_STATUS)) & GS_HST_STS) != 
    271                     0x00) { 
    272 #ifdef DEBUG 
    273                         printk("i2c-amd756.o: Failed! (%04x)\n", temp); 
    274 #endif 
    275                         return -1; 
    276                 } else { 
    277 #ifdef DEBUG 
    278                         printk("i2c-amd756.o: Successfull!\n"); 
    279 #endif 
     248        if ((temp = inw_p(SMB_GLOBAL_STATUS)) & (GS_HST_STS | GS_SMB_STS)) { 
     249#ifdef DEBUG 
     250                printk 
     251                    ("i2c-amd756.o: SMBus busy (%04x). Waiting... \n", temp); 
     252#endif 
     253                do { 
     254                        amd756_do_pause(1); 
     255                        temp = inw_p(SMB_GLOBAL_STATUS); 
     256                } while ((temp & (GS_HST_STS | GS_SMB_STS)) && 
     257                         (timeout++ < MAX_TIMEOUT)); 
     258                /* If the SMBus is still busy, we give up */ 
     259                if (timeout >= MAX_TIMEOUT) { 
     260                        printk("i2c-amd756.o: Busy wait timeout! (%04x)\n", 
     261                               temp); 
     262                        return(-1); 
    280263                } 
    281         } 
    282  
    283         /* start the transaction by setting bit 6 */ 
     264                timeout = 0; 
     265        } 
     266 
     267        /* start the transaction by setting the start bit */ 
    284268        outw_p(inw(SMB_GLOBAL_ENABLE) | GE_HOST_STC, SMB_GLOBAL_ENABLE); 
    285269 
     
    292276        /* If the SMBus is still busy, we give up */ 
    293277        if (timeout >= MAX_TIMEOUT) { 
    294 #ifdef DEBUG 
    295                 printk("i2c-amd756.o: SMBus explicit timeout!\n"); 
    296                 result = -1; 
    297 #endif 
     278                printk("i2c-amd756.o: Completion timeout!\n"); 
     279                return(-1); 
    298280        } 
    299281 
     
    301283                result = -1; 
    302284#ifdef DEBUG 
    303                 printk("i2c-amd756.o: SMBus Protocol error!\n"); 
     285                printk("i2c-amd756.o: SMBus Protocol error (no response)!\n"); 
    304286#endif 
    305287        } 
     
    325307        outw_p(GS_CLEAR_STS, SMB_GLOBAL_STATUS); 
    326308 
     309#ifdef DEBUG 
    327310        if (((temp = inw_p(SMB_GLOBAL_STATUS)) & GS_CLEAR_STS) != 0x00) { 
    328 #ifdef DEBUG 
    329311                printk 
    330312                    ("i2c-amd756.o: Failed reset at end of transaction (%04x)\n", 
    331313                     temp); 
    332 #endif 
    333         } 
    334 #ifdef DEBUG 
     314        } 
    335315        printk 
    336316            ("i2c-amd756.o: Transaction (post): GS=%04x, GE=%04x, ADD=%04x, DAT=%04x\n",