pci.c (d53cdbb94a52a920d5420ed64d986c3523a56743) | pci.c (ea2db495f92ad2cf3301623e60cb95b4062bc484) |
---|---|
1/* 2 * Sonics Silicon Backplane PCI-Hostbus related functions. 3 * 4 * Copyright (C) 2005-2006 Michael Buesch <mb@bu3sch.de> 5 * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de> 6 * Copyright (C) 2005 Stefano Brivio <st3@riseup.net> 7 * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org> 8 * Copyright (C) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch> --- 153 unchanged lines hidden (view full) --- 162 163err_pci: 164 printk(KERN_ERR PFX "Error: ssb_pci_xtal() could not access PCI config space!\n"); 165 err = -EBUSY; 166 goto out; 167} 168 169/* Get the word-offset for a SSB_SPROM_XXX define. */ | 1/* 2 * Sonics Silicon Backplane PCI-Hostbus related functions. 3 * 4 * Copyright (C) 2005-2006 Michael Buesch <mb@bu3sch.de> 5 * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de> 6 * Copyright (C) 2005 Stefano Brivio <st3@riseup.net> 7 * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org> 8 * Copyright (C) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch> --- 153 unchanged lines hidden (view full) --- 162 163err_pci: 164 printk(KERN_ERR PFX "Error: ssb_pci_xtal() could not access PCI config space!\n"); 165 err = -EBUSY; 166 goto out; 167} 168 169/* Get the word-offset for a SSB_SPROM_XXX define. */ |
170#define SPOFF(offset) (((offset) - SSB_SPROM_BASE) / sizeof(u16)) | 170#define SPOFF(offset) (((offset) - SSB_SPROM_BASE1) / sizeof(u16)) |
171/* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */ 172#define SPEX16(_outvar, _offset, _mask, _shift) \ 173 out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) 174#define SPEX32(_outvar, _offset, _mask, _shift) \ 175 out->_outvar = ((((u32)in[SPOFF((_offset)+2)] << 16 | \ 176 in[SPOFF(_offset)]) & (_mask)) >> (_shift)) 177#define SPEX(_outvar, _offset, _mask, _shift) \ 178 SPEX16(_outvar, _offset, _mask, _shift) --- 69 unchanged lines hidden (view full) --- 248 return 0; 249} 250 251static int sprom_do_read(struct ssb_bus *bus, u16 *sprom) 252{ 253 int i; 254 255 for (i = 0; i < bus->sprom_size; i++) | 171/* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */ 172#define SPEX16(_outvar, _offset, _mask, _shift) \ 173 out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) 174#define SPEX32(_outvar, _offset, _mask, _shift) \ 175 out->_outvar = ((((u32)in[SPOFF((_offset)+2)] << 16 | \ 176 in[SPOFF(_offset)]) & (_mask)) >> (_shift)) 177#define SPEX(_outvar, _offset, _mask, _shift) \ 178 SPEX16(_outvar, _offset, _mask, _shift) --- 69 unchanged lines hidden (view full) --- 248 return 0; 249} 250 251static int sprom_do_read(struct ssb_bus *bus, u16 *sprom) 252{ 253 int i; 254 255 for (i = 0; i < bus->sprom_size; i++) |
256 sprom[i] = ioread16(bus->mmio + SSB_SPROM_BASE + (i * 2)); | 256 sprom[i] = ioread16(bus->mmio + bus->sprom_offset + (i * 2)); |
257 258 return 0; 259} 260 261static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom) 262{ 263 struct pci_dev *pdev = bus->host_pci; 264 int i, err; --- 14 unchanged lines hidden (view full) --- 279 if (i == size / 4) 280 ssb_printk("25%%"); 281 else if (i == size / 2) 282 ssb_printk("50%%"); 283 else if (i == (size * 3) / 4) 284 ssb_printk("75%%"); 285 else if (i % 2) 286 ssb_printk("."); | 257 258 return 0; 259} 260 261static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom) 262{ 263 struct pci_dev *pdev = bus->host_pci; 264 int i, err; --- 14 unchanged lines hidden (view full) --- 279 if (i == size / 4) 280 ssb_printk("25%%"); 281 else if (i == size / 2) 282 ssb_printk("50%%"); 283 else if (i == (size * 3) / 4) 284 ssb_printk("75%%"); 285 else if (i % 2) 286 ssb_printk("."); |
287 writew(sprom[i], bus->mmio + SSB_SPROM_BASE + (i * 2)); | 287 writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2)); |
288 mmiowb(); 289 msleep(20); 290 } 291 err = pci_read_config_dword(pdev, SSB_SPROMCTL, &spromctl); 292 if (err) 293 goto err_ctlreg; 294 spromctl &= ~SSB_SPROMCTL_WE; 295 err = pci_write_config_dword(pdev, SSB_SPROMCTL, spromctl); --- 324 unchanged lines hidden (view full) --- 620 int err = -ENOMEM; 621 u16 *buf; 622 623 if (!ssb_is_sprom_available(bus)) { 624 ssb_printk(KERN_ERR PFX "No SPROM available!\n"); 625 return -ENODEV; 626 } 627 | 288 mmiowb(); 289 msleep(20); 290 } 291 err = pci_read_config_dword(pdev, SSB_SPROMCTL, &spromctl); 292 if (err) 293 goto err_ctlreg; 294 spromctl &= ~SSB_SPROMCTL_WE; 295 err = pci_write_config_dword(pdev, SSB_SPROMCTL, spromctl); --- 324 unchanged lines hidden (view full) --- 620 int err = -ENOMEM; 621 u16 *buf; 622 623 if (!ssb_is_sprom_available(bus)) { 624 ssb_printk(KERN_ERR PFX "No SPROM available!\n"); 625 return -ENODEV; 626 } 627 |
628 bus->sprom_offset = (bus->chipco.dev->id.revision < 31) ? 629 SSB_SPROM_BASE1 : SSB_SPROM_BASE31; 630 |
|
628 buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); 629 if (!buf) 630 goto out; 631 bus->sprom_size = SSB_SPROMSIZE_WORDS_R123; 632 sprom_do_read(bus, buf); 633 err = sprom_check_crc(buf, bus->sprom_size); 634 if (err) { 635 /* try for a 440 byte SPROM - revision 4 and higher */ --- 296 unchanged lines hidden --- | 631 buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); 632 if (!buf) 633 goto out; 634 bus->sprom_size = SSB_SPROMSIZE_WORDS_R123; 635 sprom_do_read(bus, buf); 636 err = sprom_check_crc(buf, bus->sprom_size); 637 if (err) { 638 /* try for a 440 byte SPROM - revision 4 and higher */ --- 296 unchanged lines hidden --- |