edac: i5100: cleanup

Some code cleanliness issues found by Andrew Morton (thanks!) which should
not affect functionality, but which should help make the code more
maintainable.

In particular, we now:

* convert all #define's w/ a parameter to static inlines
* use 1UL rather than 1ULL when calculating an unsigned long
* use pci_disable_device

The resulting code is tested and seems to work fine...

Signed-off-by: Arthur Jones <ajones@riverbed.com>
Cc: Doug Thompson <dougthompson@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Arthur Jones and committed by
Linus Torvalds
b238e577 178d5a74

+261 -135
+261 -135
drivers/edac/i5100_edac.c
··· 21 21 22 22 #include "edac_core.h" 23 23 24 - /* register addresses and bit field accessors... */ 24 + /* register addresses */ 25 25 26 26 /* device 16, func 1 */ 27 27 #define I5100_MC 0x40 /* Memory Control Register */ 28 - #define I5100_MC_ERRDETEN(a) ((a) >> 5 & 1) 29 28 #define I5100_MS 0x44 /* Memory Status Register */ 30 29 #define I5100_SPDDATA 0x48 /* Serial Presence Detect Status Reg */ 31 - #define I5100_SPDDATA_RDO(a) ((a) >> 15 & 1) 32 - #define I5100_SPDDATA_SBE(a) ((a) >> 13 & 1) 33 - #define I5100_SPDDATA_BUSY(a) ((a) >> 12 & 1) 34 - #define I5100_SPDDATA_DATA(a) ((a) & ((1 << 8) - 1)) 35 30 #define I5100_SPDCMD 0x4c /* Serial Presence Detect Command Reg */ 36 - #define I5100_SPDCMD_DTI(a) (((a) & ((1 << 4) - 1)) << 28) 37 - #define I5100_SPDCMD_CKOVRD(a) (((a) & 1) << 27) 38 - #define I5100_SPDCMD_SA(a) (((a) & ((1 << 3) - 1)) << 24) 39 - #define I5100_SPDCMD_BA(a) (((a) & ((1 << 8) - 1)) << 16) 40 - #define I5100_SPDCMD_DATA(a) (((a) & ((1 << 8) - 1)) << 8) 41 - #define I5100_SPDCMD_CMD(a) ((a) & 1) 42 31 #define I5100_TOLM 0x6c /* Top of Low Memory */ 43 - #define I5100_TOLM_TOLM(a) ((a) >> 12 & ((1 << 4) - 1)) 44 32 #define I5100_MIR0 0x80 /* Memory Interleave Range 0 */ 45 33 #define I5100_MIR1 0x84 /* Memory Interleave Range 1 */ 46 34 #define I5100_AMIR_0 0x8c /* Adjusted Memory Interleave Range 0 */ 47 35 #define I5100_AMIR_1 0x90 /* Adjusted Memory Interleave Range 1 */ 48 - #define I5100_MIR_LIMIT(a) ((a) >> 4 & ((1 << 12) - 1)) 49 - #define I5100_MIR_WAY1(a) ((a) >> 1 & 1) 50 - #define I5100_MIR_WAY0(a) ((a) & 1) 51 36 #define I5100_FERR_NF_MEM 0xa0 /* MC First Non Fatal Errors */ 52 - #define I5100_FERR_NF_MEM_CHAN_INDX(a) ((a) >> 28 & 1) 53 - #define I5100_FERR_NF_MEM_SPD_MASK (1 << 18) 54 37 #define I5100_FERR_NF_MEM_M16ERR_MASK (1 << 16) 55 38 #define I5100_FERR_NF_MEM_M15ERR_MASK (1 << 15) 56 39 #define I5100_FERR_NF_MEM_M14ERR_MASK (1 << 14) ··· 55 72 I5100_FERR_NF_MEM_M5ERR_MASK | \ 56 73 I5100_FERR_NF_MEM_M4ERR_MASK | \ 57 74 I5100_FERR_NF_MEM_M1ERR_MASK) 58 - #define I5100_FERR_NF_MEM_ANY(a) ((a) & I5100_FERR_NF_MEM_ANY_MASK) 59 75 #define I5100_NERR_NF_MEM 0xa4 /* MC Next Non-Fatal Errors */ 60 - #define I5100_NERR_NF_MEM_ANY(a) I5100_FERR_NF_MEM_ANY(a) 61 76 #define I5100_EMASK_MEM 0xa8 /* MC Error Mask Register */ 62 77 63 78 /* device 21 and 22, func 0 */ 64 79 #define I5100_MTR_0 0x154 /* Memory Technology Registers 0-3 */ 65 80 #define I5100_DMIR 0x15c /* DIMM Interleave Range */ 66 - #define I5100_DMIR_LIMIT(a) ((a) >> 16 & ((1 << 11) - 1)) 67 - #define I5100_DMIR_RANK(a, i) ((a) >> (4 * i) & ((1 << 2) - 1)) 68 - #define I5100_MTR_4 0x1b0 /* Memory Technology Registers 4,5 */ 69 - #define I5100_MTR_PRESENT(a) ((a) >> 10 & 1) 70 - #define I5100_MTR_ETHROTTLE(a) ((a) >> 9 & 1) 71 - #define I5100_MTR_WIDTH(a) ((a) >> 8 & 1) 72 - #define I5100_MTR_NUMBANK(a) ((a) >> 6 & 1) 73 - #define I5100_MTR_NUMROW(a) ((a) >> 2 & ((1 << 2) - 1)) 74 - #define I5100_MTR_NUMCOL(a) ((a) & ((1 << 2) - 1)) 75 81 #define I5100_VALIDLOG 0x18c /* Valid Log Markers */ 76 - #define I5100_VALIDLOG_REDMEMVALID(a) ((a) >> 2 & 1) 77 - #define I5100_VALIDLOG_RECMEMVALID(a) ((a) >> 1 & 1) 78 - #define I5100_VALIDLOG_NRECMEMVALID(a) ((a) & 1) 79 82 #define I5100_NRECMEMA 0x190 /* Non-Recoverable Memory Error Log Reg A */ 80 - #define I5100_NRECMEMA_MERR(a) ((a) >> 15 & ((1 << 5) - 1)) 81 - #define I5100_NRECMEMA_BANK(a) ((a) >> 12 & ((1 << 3) - 1)) 82 - #define I5100_NRECMEMA_RANK(a) ((a) >> 8 & ((1 << 3) - 1)) 83 - #define I5100_NRECMEMA_DM_BUF_ID(a) ((a) & ((1 << 8) - 1)) 84 83 #define I5100_NRECMEMB 0x194 /* Non-Recoverable Memory Error Log Reg B */ 85 - #define I5100_NRECMEMB_CAS(a) ((a) >> 16 & ((1 << 13) - 1)) 86 - #define I5100_NRECMEMB_RAS(a) ((a) & ((1 << 16) - 1)) 87 84 #define I5100_REDMEMA 0x198 /* Recoverable Memory Data Error Log Reg A */ 88 - #define I5100_REDMEMA_SYNDROME(a) (a) 89 85 #define I5100_REDMEMB 0x19c /* Recoverable Memory Data Error Log Reg B */ 90 - #define I5100_REDMEMB_ECC_LOCATOR(a) ((a) & ((1 << 18) - 1)) 91 86 #define I5100_RECMEMA 0x1a0 /* Recoverable Memory Error Log Reg A */ 92 - #define I5100_RECMEMA_MERR(a) I5100_NRECMEMA_MERR(a) 93 - #define I5100_RECMEMA_BANK(a) I5100_NRECMEMA_BANK(a) 94 - #define I5100_RECMEMA_RANK(a) I5100_NRECMEMA_RANK(a) 95 - #define I5100_RECMEMA_DM_BUF_ID(a) I5100_NRECMEMA_DM_BUF_ID(a) 96 87 #define I5100_RECMEMB 0x1a4 /* Recoverable Memory Error Log Reg B */ 97 - #define I5100_RECMEMB_CAS(a) I5100_NRECMEMB_CAS(a) 98 - #define I5100_RECMEMB_RAS(a) I5100_NRECMEMB_RAS(a) 88 + #define I5100_MTR_4 0x1b0 /* Memory Technology Registers 4,5 */ 89 + 90 + /* bit field accessors */ 91 + 92 + static inline u32 i5100_mc_errdeten(u32 mc) 93 + { 94 + return mc >> 5 & 1; 95 + } 96 + 97 + static inline u16 i5100_spddata_rdo(u16 a) 98 + { 99 + return a >> 15 & 1; 100 + } 101 + 102 + static inline u16 i5100_spddata_sbe(u16 a) 103 + { 104 + return a >> 13 & 1; 105 + } 106 + 107 + static inline u16 i5100_spddata_busy(u16 a) 108 + { 109 + return a >> 12 & 1; 110 + } 111 + 112 + static inline u16 i5100_spddata_data(u16 a) 113 + { 114 + return a & ((1 << 8) - 1); 115 + } 116 + 117 + static inline u32 i5100_spdcmd_create(u32 dti, u32 ckovrd, u32 sa, u32 ba, 118 + u32 data, u32 cmd) 119 + { 120 + return ((dti & ((1 << 4) - 1)) << 28) | 121 + ((ckovrd & 1) << 27) | 122 + ((sa & ((1 << 3) - 1)) << 24) | 123 + ((ba & ((1 << 8) - 1)) << 16) | 124 + ((data & ((1 << 8) - 1)) << 8) | 125 + (cmd & 1); 126 + } 127 + 128 + static inline u16 i5100_tolm_tolm(u16 a) 129 + { 130 + return a >> 12 & ((1 << 4) - 1); 131 + } 132 + 133 + static inline u16 i5100_mir_limit(u16 a) 134 + { 135 + return a >> 4 & ((1 << 12) - 1); 136 + } 137 + 138 + static inline u16 i5100_mir_way1(u16 a) 139 + { 140 + return a >> 1 & 1; 141 + } 142 + 143 + static inline u16 i5100_mir_way0(u16 a) 144 + { 145 + return a & 1; 146 + } 147 + 148 + static inline u32 i5100_ferr_nf_mem_chan_indx(u32 a) 149 + { 150 + return a >> 28 & 1; 151 + } 152 + 153 + static inline u32 i5100_ferr_nf_mem_any(u32 a) 154 + { 155 + return a & I5100_FERR_NF_MEM_ANY_MASK; 156 + } 157 + 158 + static inline u32 i5100_nerr_nf_mem_any(u32 a) 159 + { 160 + return i5100_ferr_nf_mem_any(a); 161 + } 162 + 163 + static inline u32 i5100_dmir_limit(u32 a) 164 + { 165 + return a >> 16 & ((1 << 11) - 1); 166 + } 167 + 168 + static inline u32 i5100_dmir_rank(u32 a, u32 i) 169 + { 170 + return a >> (4 * i) & ((1 << 2) - 1); 171 + } 172 + 173 + static inline u16 i5100_mtr_present(u16 a) 174 + { 175 + return a >> 10 & 1; 176 + } 177 + 178 + static inline u16 i5100_mtr_ethrottle(u16 a) 179 + { 180 + return a >> 9 & 1; 181 + } 182 + 183 + static inline u16 i5100_mtr_width(u16 a) 184 + { 185 + return a >> 8 & 1; 186 + } 187 + 188 + static inline u16 i5100_mtr_numbank(u16 a) 189 + { 190 + return a >> 6 & 1; 191 + } 192 + 193 + static inline u16 i5100_mtr_numrow(u16 a) 194 + { 195 + return a >> 2 & ((1 << 2) - 1); 196 + } 197 + 198 + static inline u16 i5100_mtr_numcol(u16 a) 199 + { 200 + return a & ((1 << 2) - 1); 201 + } 202 + 203 + 204 + static inline u32 i5100_validlog_redmemvalid(u32 a) 205 + { 206 + return a >> 2 & 1; 207 + } 208 + 209 + static inline u32 i5100_validlog_recmemvalid(u32 a) 210 + { 211 + return a >> 1 & 1; 212 + } 213 + 214 + static inline u32 i5100_validlog_nrecmemvalid(u32 a) 215 + { 216 + return a & 1; 217 + } 218 + 219 + static inline u32 i5100_nrecmema_merr(u32 a) 220 + { 221 + return a >> 15 & ((1 << 5) - 1); 222 + } 223 + 224 + static inline u32 i5100_nrecmema_bank(u32 a) 225 + { 226 + return a >> 12 & ((1 << 3) - 1); 227 + } 228 + 229 + static inline u32 i5100_nrecmema_rank(u32 a) 230 + { 231 + return a >> 8 & ((1 << 3) - 1); 232 + } 233 + 234 + static inline u32 i5100_nrecmema_dm_buf_id(u32 a) 235 + { 236 + return a & ((1 << 8) - 1); 237 + } 238 + 239 + static inline u32 i5100_nrecmemb_cas(u32 a) 240 + { 241 + return a >> 16 & ((1 << 13) - 1); 242 + } 243 + 244 + static inline u32 i5100_nrecmemb_ras(u32 a) 245 + { 246 + return a & ((1 << 16) - 1); 247 + } 248 + 249 + static inline u32 i5100_redmemb_ecc_locator(u32 a) 250 + { 251 + return a & ((1 << 18) - 1); 252 + } 253 + 254 + static inline u32 i5100_recmema_merr(u32 a) 255 + { 256 + return i5100_nrecmema_merr(a); 257 + } 258 + 259 + static inline u32 i5100_recmema_bank(u32 a) 260 + { 261 + return i5100_nrecmema_bank(a); 262 + } 263 + 264 + static inline u32 i5100_recmema_rank(u32 a) 265 + { 266 + return i5100_nrecmema_rank(a); 267 + } 268 + 269 + static inline u32 i5100_recmema_dm_buf_id(u32 a) 270 + { 271 + return i5100_nrecmema_dm_buf_id(a); 272 + } 273 + 274 + static inline u32 i5100_recmemb_cas(u32 a) 275 + { 276 + return i5100_nrecmemb_cas(a); 277 + } 278 + 279 + static inline u32 i5100_recmemb_ras(u32 a) 280 + { 281 + return i5100_nrecmemb_ras(a); 282 + } 99 283 100 284 /* some generic limits */ 101 285 #define I5100_MAX_RANKS_PER_CTLR 6 ··· 339 189 return -1; 340 190 } 341 191 342 - /* 343 - * The processor bus memory addresses are broken into three 344 - * pieces, whereas the controller addresses are contiguous. 345 - * 346 - * here we map from the controller address space to the 347 - * processor address space: 348 - * 349 - * Processor Address Space 350 - * +-----------------------------+ 351 - * | | 352 - * | "high" memory addresses | 353 - * | | 354 - * +-----------------------------+ <- 4GB on the i5100 355 - * | | 356 - * | other non-memory addresses | 357 - * | | 358 - * +-----------------------------+ <- top of low memory 359 - * | | 360 - * | "low" memory addresses | 361 - * | | 362 - * +-----------------------------+ 363 - */ 364 - static unsigned long i5100_ctl_page_to_phys(struct mem_ctl_info *mci, 365 - unsigned long cntlr_addr) 366 - { 367 - const struct i5100_priv *priv = mci->pvt_info; 368 - 369 - if (cntlr_addr < priv->tolm) 370 - return cntlr_addr; 371 - 372 - return (1ULL << 32) + (cntlr_addr - priv->tolm); 373 - } 374 - 375 192 static const char *i5100_err_msg(unsigned err) 376 193 { 377 - const char *merrs[] = { 194 + static const char *merrs[] = { 378 195 "unknown", /* 0 */ 379 196 "uncorrectable data ECC on replay", /* 1 */ 380 197 "unknown", /* 2 */ ··· 458 341 459 342 pci_read_config_dword(pdev, I5100_VALIDLOG, &dw); 460 343 461 - if (I5100_VALIDLOG_REDMEMVALID(dw)) { 344 + if (i5100_validlog_redmemvalid(dw)) { 462 345 pci_read_config_dword(pdev, I5100_REDMEMA, &dw2); 463 - syndrome = I5100_REDMEMA_SYNDROME(dw2); 346 + syndrome = dw2; 464 347 pci_read_config_dword(pdev, I5100_REDMEMB, &dw2); 465 - ecc_loc = I5100_REDMEMB_ECC_LOCATOR(dw2); 348 + ecc_loc = i5100_redmemb_ecc_locator(dw2); 466 349 } 467 350 468 - if (I5100_VALIDLOG_RECMEMVALID(dw)) { 351 + if (i5100_validlog_recmemvalid(dw)) { 469 352 const char *msg; 470 353 471 354 pci_read_config_dword(pdev, I5100_RECMEMA, &dw2); 472 - merr = I5100_RECMEMA_MERR(dw2); 473 - bank = I5100_RECMEMA_BANK(dw2); 474 - rank = I5100_RECMEMA_RANK(dw2); 355 + merr = i5100_recmema_merr(dw2); 356 + bank = i5100_recmema_bank(dw2); 357 + rank = i5100_recmema_rank(dw2); 475 358 476 359 pci_read_config_dword(pdev, I5100_RECMEMB, &dw2); 477 - cas = I5100_RECMEMB_CAS(dw2); 478 - ras = I5100_RECMEMB_RAS(dw2); 360 + cas = i5100_recmemb_cas(dw2); 361 + ras = i5100_recmemb_ras(dw2); 479 362 480 363 /* FIXME: not really sure if this is what merr is... 481 364 */ ··· 487 370 i5100_handle_ce(mci, ctlr, bank, rank, syndrome, cas, ras, msg); 488 371 } 489 372 490 - if (I5100_VALIDLOG_NRECMEMVALID(dw)) { 373 + if (i5100_validlog_nrecmemvalid(dw)) { 491 374 const char *msg; 492 375 493 376 pci_read_config_dword(pdev, I5100_NRECMEMA, &dw2); 494 - merr = I5100_NRECMEMA_MERR(dw2); 495 - bank = I5100_NRECMEMA_BANK(dw2); 496 - rank = I5100_NRECMEMA_RANK(dw2); 377 + merr = i5100_nrecmema_merr(dw2); 378 + bank = i5100_nrecmema_bank(dw2); 379 + rank = i5100_nrecmema_rank(dw2); 497 380 498 381 pci_read_config_dword(pdev, I5100_NRECMEMB, &dw2); 499 - cas = I5100_NRECMEMB_CAS(dw2); 500 - ras = I5100_NRECMEMB_RAS(dw2); 382 + cas = i5100_nrecmemb_cas(dw2); 383 + ras = i5100_nrecmemb_ras(dw2); 501 384 502 385 /* FIXME: not really sure if this is what merr is... 503 386 */ ··· 519 402 520 403 521 404 pci_read_config_dword(priv->mc, I5100_FERR_NF_MEM, &dw); 522 - if (I5100_FERR_NF_MEM_ANY(dw)) { 405 + if (i5100_ferr_nf_mem_any(dw)) { 523 406 u32 dw2; 524 407 525 408 pci_read_config_dword(priv->mc, I5100_NERR_NF_MEM, &dw2); ··· 528 411 dw2); 529 412 pci_write_config_dword(priv->mc, I5100_FERR_NF_MEM, dw); 530 413 531 - i5100_read_log(mci, I5100_FERR_NF_MEM_CHAN_INDX(dw), 532 - I5100_FERR_NF_MEM_ANY(dw), 533 - I5100_NERR_NF_MEM_ANY(dw2)); 414 + i5100_read_log(mci, i5100_ferr_nf_mem_chan_indx(dw), 415 + i5100_ferr_nf_mem_any(dw), 416 + i5100_nerr_nf_mem_any(dw2)); 534 417 } 535 418 } 536 419 ··· 593 476 594 477 pci_read_config_word(pdev, addr, &w); 595 478 596 - priv->mtr[i][j].present = I5100_MTR_PRESENT(w); 597 - priv->mtr[i][j].ethrottle = I5100_MTR_ETHROTTLE(w); 598 - priv->mtr[i][j].width = 4 + 4 * I5100_MTR_WIDTH(w); 599 - priv->mtr[i][j].numbank = 2 + I5100_MTR_NUMBANK(w); 600 - priv->mtr[i][j].numrow = 13 + I5100_MTR_NUMROW(w); 601 - priv->mtr[i][j].numcol = 10 + I5100_MTR_NUMCOL(w); 479 + priv->mtr[i][j].present = i5100_mtr_present(w); 480 + priv->mtr[i][j].ethrottle = i5100_mtr_ethrottle(w); 481 + priv->mtr[i][j].width = 4 + 4 * i5100_mtr_width(w); 482 + priv->mtr[i][j].numbank = 2 + i5100_mtr_numbank(w); 483 + priv->mtr[i][j].numrow = 13 + i5100_mtr_numrow(w); 484 + priv->mtr[i][j].numcol = 10 + i5100_mtr_numcol(w); 602 485 } 603 486 } 604 487 } ··· 612 495 { 613 496 struct i5100_priv *priv = mci->pvt_info; 614 497 u16 w; 615 - u32 dw; 616 498 unsigned long et; 617 499 618 500 pci_read_config_word(priv->mc, I5100_SPDDATA, &w); 619 - if (I5100_SPDDATA_BUSY(w)) 501 + if (i5100_spddata_busy(w)) 620 502 return -1; 621 503 622 - dw = I5100_SPDCMD_DTI(0xa) | 623 - I5100_SPDCMD_CKOVRD(1) | 624 - I5100_SPDCMD_SA(ch * 4 + slot) | 625 - I5100_SPDCMD_BA(addr) | 626 - I5100_SPDCMD_DATA(0) | 627 - I5100_SPDCMD_CMD(0); 628 - pci_write_config_dword(priv->mc, I5100_SPDCMD, dw); 504 + pci_write_config_dword(priv->mc, I5100_SPDCMD, 505 + i5100_spdcmd_create(0xa, 1, ch * 4 + slot, addr, 506 + 0, 0)); 629 507 630 508 /* wait up to 100ms */ 631 509 et = jiffies + HZ / 10; 632 510 udelay(100); 633 511 while (1) { 634 512 pci_read_config_word(priv->mc, I5100_SPDDATA, &w); 635 - if (!I5100_SPDDATA_BUSY(w)) 513 + if (!i5100_spddata_busy(w)) 636 514 break; 637 515 udelay(100); 638 516 } 639 517 640 - if (!I5100_SPDDATA_RDO(w) || I5100_SPDDATA_SBE(w)) 518 + if (!i5100_spddata_rdo(w) || i5100_spddata_sbe(w)) 641 519 return -1; 642 520 643 - *byte = I5100_SPDDATA_DATA(w); 521 + *byte = i5100_spddata_data(w); 644 522 645 523 return 0; 646 524 } ··· 703 591 int i; 704 592 705 593 pci_read_config_word(pdev, I5100_TOLM, &w); 706 - priv->tolm = (u64) I5100_TOLM_TOLM(w) * 256 * 1024 * 1024; 594 + priv->tolm = (u64) i5100_tolm_tolm(w) * 256 * 1024 * 1024; 707 595 708 596 pci_read_config_word(pdev, I5100_MIR0, &w); 709 - priv->mir[0].limit = (u64) I5100_MIR_LIMIT(w) << 28; 710 - priv->mir[0].way[1] = I5100_MIR_WAY1(w); 711 - priv->mir[0].way[0] = I5100_MIR_WAY0(w); 597 + priv->mir[0].limit = (u64) i5100_mir_limit(w) << 28; 598 + priv->mir[0].way[1] = i5100_mir_way1(w); 599 + priv->mir[0].way[0] = i5100_mir_way0(w); 712 600 713 601 pci_read_config_word(pdev, I5100_MIR1, &w); 714 - priv->mir[1].limit = (u64) I5100_MIR_LIMIT(w) << 28; 715 - priv->mir[1].way[1] = I5100_MIR_WAY1(w); 716 - priv->mir[1].way[0] = I5100_MIR_WAY0(w); 602 + priv->mir[1].limit = (u64) i5100_mir_limit(w) << 28; 603 + priv->mir[1].way[1] = i5100_mir_way1(w); 604 + priv->mir[1].way[0] = i5100_mir_way0(w); 717 605 718 606 pci_read_config_word(pdev, I5100_AMIR_0, &w); 719 607 priv->amir[0] = w; ··· 729 617 pci_read_config_dword(mms[i], I5100_DMIR + j * 4, &dw); 730 618 731 619 priv->dmir[i][j].limit = 732 - (u64) I5100_DMIR_LIMIT(dw) << 28; 620 + (u64) i5100_dmir_limit(dw) << 28; 733 621 for (k = 0; k < I5100_MAX_RANKS_PER_DIMM; k++) 734 622 priv->dmir[i][j].rank[k] = 735 - I5100_DMIR_RANK(dw, k); 623 + i5100_dmir_rank(dw, k); 736 624 } 737 625 } 738 626 ··· 805 693 806 694 /* ECC enabled? */ 807 695 pci_read_config_dword(pdev, I5100_MC, &dw); 808 - if (!I5100_MC_ERRDETEN(dw)) { 696 + if (!i5100_mc_errdeten(dw)) { 809 697 printk(KERN_INFO "i5100_edac: ECC not enabled.\n"); 810 698 ret = -ENODEV; 811 - goto bail; 699 + goto bail_pdev; 812 700 } 813 701 814 702 /* figure out how many ranks, from strapped state of 48GB_Mode input */ ··· 819 707 /* FIXME: get 6 ranks / controller to work - need hw... */ 820 708 printk(KERN_INFO "i5100_edac: unsupported configuration.\n"); 821 709 ret = -ENODEV; 822 - goto bail; 710 + goto bail_pdev; 823 711 } 824 712 825 713 /* enable error reporting... */ ··· 830 718 /* device 21, func 0, Channel 0 Memory Map, Error Flag/Mask, etc... */ 831 719 ch0mm = pci_get_device_func(PCI_VENDOR_ID_INTEL, 832 720 PCI_DEVICE_ID_INTEL_5100_21, 0); 833 - if (!ch0mm) 834 - return -ENODEV; 721 + if (!ch0mm) { 722 + ret = -ENODEV; 723 + goto bail_pdev; 724 + } 835 725 836 726 rc = pci_enable_device(ch0mm); 837 727 if (rc < 0) { ··· 846 732 PCI_DEVICE_ID_INTEL_5100_22, 0); 847 733 if (!ch1mm) { 848 734 ret = -ENODEV; 849 - goto bail_ch0; 735 + goto bail_disable_ch0; 850 736 } 851 737 852 738 rc = pci_enable_device(ch1mm); ··· 858 744 mci = edac_mc_alloc(sizeof(*priv), ranksperch * 2, 1, 0); 859 745 if (!mci) { 860 746 ret = -ENOMEM; 861 - goto bail_ch1; 747 + goto bail_disable_ch1; 862 748 } 863 749 864 750 mci->dev = &pdev->dev; ··· 879 765 mci->mod_ver = "not versioned"; 880 766 mci->ctl_name = "i5100"; 881 767 mci->dev_name = pci_name(pdev); 882 - mci->ctl_page_to_phys = i5100_ctl_page_to_phys; 768 + mci->ctl_page_to_phys = NULL; 883 769 884 770 mci->edac_check = i5100_check_error; 885 771 ··· 900 786 goto bail_mc; 901 787 } 902 788 903 - goto bail; 789 + return ret; 904 790 905 791 bail_mc: 906 792 edac_mc_free(mci); 907 793 794 + bail_disable_ch1: 795 + pci_disable_device(ch1mm); 796 + 908 797 bail_ch1: 909 798 pci_dev_put(ch1mm); 910 799 800 + bail_disable_ch0: 801 + pci_disable_device(ch0mm); 802 + 911 803 bail_ch0: 912 804 pci_dev_put(ch0mm); 805 + 806 + bail_pdev: 807 + pci_disable_device(pdev); 913 808 914 809 bail: 915 810 return ret; ··· 935 812 return; 936 813 937 814 priv = mci->pvt_info; 815 + pci_disable_device(pdev); 816 + pci_disable_device(priv->ch0mm); 817 + pci_disable_device(priv->ch1mm); 938 818 pci_dev_put(priv->ch0mm); 939 819 pci_dev_put(priv->ch1mm); 940 820