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 ---