diff options
| -rw-r--r-- | drivers/pci/hotplug/shpchp_ctrl.c | 152 | ||||
| -rw-r--r-- | drivers/pci/hotplug/shpchp_hpc.c | 466 |
2 files changed, 189 insertions, 429 deletions
diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c index 10f3257b18a7..4e6381481c55 100644 --- a/drivers/pci/hotplug/shpchp_ctrl.c +++ b/drivers/pci/hotplug/shpchp_ctrl.c | |||
| @@ -198,7 +198,8 @@ static int change_bus_speed(struct controller *ctrl, struct slot *p_slot, | |||
| 198 | 198 | ||
| 199 | dbg("%s: change to speed %d\n", __FUNCTION__, speed); | 199 | dbg("%s: change to speed %d\n", __FUNCTION__, speed); |
| 200 | if ((rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, speed))) { | 200 | if ((rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, speed))) { |
| 201 | err("%s: Issue of set bus speed mode command failed\n", __FUNCTION__); | 201 | err("%s: Issue of set bus speed mode command failed\n", |
| 202 | __FUNCTION__); | ||
| 202 | return WRONG_BUS_FREQUENCY; | 203 | return WRONG_BUS_FREQUENCY; |
| 203 | } | 204 | } |
| 204 | return rc; | 205 | return rc; |
| @@ -209,33 +210,26 @@ static int fix_bus_speed(struct controller *ctrl, struct slot *pslot, | |||
| 209 | enum pci_bus_speed msp) | 210 | enum pci_bus_speed msp) |
| 210 | { | 211 | { |
| 211 | int rc = 0; | 212 | int rc = 0; |
| 212 | 213 | ||
| 213 | if (flag != 0) { /* Other slots on the same bus are occupied */ | 214 | /* |
| 214 | if ( asp < bsp ) { | 215 | * If other slots on the same bus are occupied, we cannot |
| 215 | err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bsp, asp); | 216 | * change the bus speed. |
| 216 | return WRONG_BUS_FREQUENCY; | 217 | */ |
| 218 | if (flag) { | ||
| 219 | if (asp < bsp) { | ||
| 220 | err("%s: speed of bus %x and adapter %x mismatch\n", | ||
| 221 | __FUNCTION__, bsp, asp); | ||
| 222 | rc = WRONG_BUS_FREQUENCY; | ||
| 217 | } | 223 | } |
| 224 | return rc; | ||
| 225 | } | ||
| 226 | |||
| 227 | if (asp < msp) { | ||
| 228 | if (bsp != asp) | ||
| 229 | rc = change_bus_speed(ctrl, pslot, asp); | ||
| 218 | } else { | 230 | } else { |
| 219 | /* Other slots on the same bus are empty */ | 231 | if (bsp != msp) |
| 220 | if (msp == bsp) { | 232 | rc = change_bus_speed(ctrl, pslot, msp); |
| 221 | /* if adapter_speed >= bus_speed, do nothing */ | ||
| 222 | if (asp < bsp) { | ||
| 223 | /* | ||
| 224 | * Try to lower bus speed to accommodate the adapter if other slots | ||
| 225 | * on the same controller are empty | ||
| 226 | */ | ||
| 227 | if ((rc = change_bus_speed(ctrl, pslot, asp))) | ||
| 228 | return rc; | ||
| 229 | } | ||
| 230 | } else { | ||
| 231 | if (asp < msp) { | ||
| 232 | if ((rc = change_bus_speed(ctrl, pslot, asp))) | ||
| 233 | return rc; | ||
| 234 | } else { | ||
| 235 | if ((rc = change_bus_speed(ctrl, pslot, msp))) | ||
| 236 | return rc; | ||
| 237 | } | ||
| 238 | } | ||
| 239 | } | 233 | } |
| 240 | return rc; | 234 | return rc; |
| 241 | } | 235 | } |
| @@ -252,8 +246,7 @@ static int board_added(struct slot *p_slot) | |||
| 252 | u8 hp_slot; | 246 | u8 hp_slot; |
| 253 | u8 slots_not_empty = 0; | 247 | u8 slots_not_empty = 0; |
| 254 | int rc = 0; | 248 | int rc = 0; |
| 255 | enum pci_bus_speed adapter_speed, bus_speed, max_bus_speed; | 249 | enum pci_bus_speed asp, bsp, msp; |
| 256 | u8 pi, mode; | ||
| 257 | struct controller *ctrl = p_slot->ctrl; | 250 | struct controller *ctrl = p_slot->ctrl; |
| 258 | 251 | ||
| 259 | hp_slot = p_slot->device - ctrl->slot_device_offset; | 252 | hp_slot = p_slot->device - ctrl->slot_device_offset; |
| @@ -285,109 +278,36 @@ static int board_added(struct slot *p_slot) | |||
| 285 | } | 278 | } |
| 286 | } | 279 | } |
| 287 | 280 | ||
| 288 | rc = p_slot->hpc_ops->get_adapter_speed(p_slot, &adapter_speed); | 281 | rc = p_slot->hpc_ops->get_adapter_speed(p_slot, &asp); |
| 289 | /* 0 = PCI 33Mhz, 1 = PCI 66 Mhz, 2 = PCI-X 66 PA, 4 = PCI-X 66 ECC, */ | 282 | if (rc) { |
| 290 | /* 5 = PCI-X 133 PA, 7 = PCI-X 133 ECC, 0xa = PCI-X 133 Mhz 266, */ | 283 | err("%s: Can't get adapter speed or bus mode mismatch\n", |
| 291 | /* 0xd = PCI-X 133 Mhz 533 */ | 284 | __FUNCTION__); |
| 292 | /* This encoding is different from the one used in cur_bus_speed & */ | ||
| 293 | /* max_bus_speed */ | ||
| 294 | |||
| 295 | if (rc || adapter_speed == PCI_SPEED_UNKNOWN) { | ||
| 296 | err("%s: Can't get adapter speed or bus mode mismatch\n", __FUNCTION__); | ||
| 297 | return WRONG_BUS_FREQUENCY; | 285 | return WRONG_BUS_FREQUENCY; |
| 298 | } | 286 | } |
| 299 | 287 | ||
| 300 | rc = p_slot->hpc_ops->get_cur_bus_speed(p_slot, &bus_speed); | 288 | rc = p_slot->hpc_ops->get_cur_bus_speed(p_slot, &bsp); |
| 301 | if (rc || bus_speed == PCI_SPEED_UNKNOWN) { | 289 | if (rc) { |
| 302 | err("%s: Can't get bus operation speed\n", __FUNCTION__); | 290 | err("%s: Can't get bus operation speed\n", __FUNCTION__); |
| 303 | return WRONG_BUS_FREQUENCY; | 291 | return WRONG_BUS_FREQUENCY; |
| 304 | } | 292 | } |
| 305 | 293 | ||
| 306 | rc = p_slot->hpc_ops->get_max_bus_speed(p_slot, &max_bus_speed); | 294 | rc = p_slot->hpc_ops->get_max_bus_speed(p_slot, &msp); |
| 307 | if (rc || max_bus_speed == PCI_SPEED_UNKNOWN) { | 295 | if (rc) { |
| 308 | err("%s: Can't get max bus operation speed\n", __FUNCTION__); | 296 | err("%s: Can't get max bus operation speed\n", __FUNCTION__); |
| 309 | max_bus_speed = bus_speed; | 297 | msp = bsp; |
| 310 | } | ||
| 311 | |||
| 312 | if ((rc = p_slot->hpc_ops->get_prog_int(p_slot, &pi))) { | ||
| 313 | err("%s: Can't get controller programming interface, set it to 1\n", __FUNCTION__); | ||
| 314 | pi = 1; | ||
| 315 | } | 298 | } |
| 316 | 299 | ||
| 317 | /* Check if there are other slots or devices on the same bus */ | 300 | /* Check if there are other slots or devices on the same bus */ |
| 318 | if (!list_empty(&ctrl->pci_dev->subordinate->devices)) | 301 | if (!list_empty(&ctrl->pci_dev->subordinate->devices)) |
| 319 | slots_not_empty = 1; | 302 | slots_not_empty = 1; |
| 320 | 303 | ||
| 321 | dbg("%s: slots_not_empty %d, pi %d\n", __FUNCTION__, | 304 | dbg("%s: slots_not_empty %d, adapter_speed %d, bus_speed %d, " |
| 322 | slots_not_empty, pi); | 305 | "max_bus_speed %d\n", __FUNCTION__, slots_not_empty, asp, |
| 323 | dbg("adapter_speed %d, bus_speed %d, max_bus_speed %d\n", | 306 | bsp, msp); |
| 324 | adapter_speed, bus_speed, max_bus_speed); | ||
| 325 | |||
| 326 | if (pi == 2) { | ||
| 327 | dbg("%s: In PI = %d\n", __FUNCTION__, pi); | ||
| 328 | if ((rc = p_slot->hpc_ops->get_mode1_ECC_cap(p_slot, &mode))) { | ||
| 329 | err("%s: Can't get Mode1_ECC, set mode to 0\n", __FUNCTION__); | ||
| 330 | mode = 0; | ||
| 331 | } | ||
| 332 | 307 | ||
| 333 | switch (adapter_speed) { | 308 | rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, asp, bsp, msp); |
| 334 | case PCI_SPEED_133MHz_PCIX_533: | 309 | if (rc) |
| 335 | case PCI_SPEED_133MHz_PCIX_266: | 310 | return rc; |
| 336 | if ((bus_speed != adapter_speed) && | ||
| 337 | ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) | ||
| 338 | return rc; | ||
| 339 | break; | ||
| 340 | case PCI_SPEED_133MHz_PCIX_ECC: | ||
| 341 | case PCI_SPEED_133MHz_PCIX: | ||
| 342 | if (mode) { /* Bus - Mode 1 ECC */ | ||
| 343 | if ((bus_speed != 0x7) && | ||
| 344 | ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) | ||
| 345 | return rc; | ||
| 346 | } else { | ||
| 347 | if ((bus_speed != 0x4) && | ||
| 348 | ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) | ||
| 349 | return rc; | ||
| 350 | } | ||
| 351 | break; | ||
| 352 | case PCI_SPEED_66MHz_PCIX_ECC: | ||
| 353 | case PCI_SPEED_66MHz_PCIX: | ||
| 354 | if (mode) { /* Bus - Mode 1 ECC */ | ||
| 355 | if ((bus_speed != 0x5) && | ||
| 356 | ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) | ||
| 357 | return rc; | ||
| 358 | } else { | ||
| 359 | if ((bus_speed != 0x2) && | ||
| 360 | ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) | ||
| 361 | return rc; | ||
| 362 | } | ||
| 363 | break; | ||
| 364 | case PCI_SPEED_66MHz: | ||
| 365 | if ((bus_speed != 0x1) && | ||
| 366 | ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) | ||
| 367 | return rc; | ||
| 368 | break; | ||
| 369 | case PCI_SPEED_33MHz: | ||
| 370 | if (bus_speed > 0x0) { | ||
| 371 | if (slots_not_empty == 0) { | ||
| 372 | if ((rc = change_bus_speed(ctrl, p_slot, adapter_speed))) | ||
| 373 | return rc; | ||
| 374 | } else { | ||
| 375 | err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bus_speed, adapter_speed); | ||
| 376 | return WRONG_BUS_FREQUENCY; | ||
| 377 | } | ||
| 378 | } | ||
| 379 | break; | ||
| 380 | default: | ||
| 381 | err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bus_speed, adapter_speed); | ||
| 382 | return WRONG_BUS_FREQUENCY; | ||
| 383 | } | ||
| 384 | } else { | ||
| 385 | /* If adpater_speed == bus_speed, nothing to do here */ | ||
| 386 | dbg("%s: In PI = %d\n", __FUNCTION__, pi); | ||
| 387 | if ((adapter_speed != bus_speed) && | ||
| 388 | ((rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, adapter_speed, bus_speed, max_bus_speed)))) | ||
| 389 | return rc; | ||
| 390 | } | ||
| 391 | 311 | ||
| 392 | /* turn on board, blink green LED, turn off Amber LED */ | 312 | /* turn on board, blink green LED, turn off Amber LED */ |
| 393 | if ((rc = p_slot->hpc_ops->slot_enable(p_slot))) { | 313 | if ((rc = p_slot->hpc_ops->slot_enable(p_slot))) { |
diff --git a/drivers/pci/hotplug/shpchp_hpc.c b/drivers/pci/hotplug/shpchp_hpc.c index b392606a905a..66123cf4deaa 100644 --- a/drivers/pci/hotplug/shpchp_hpc.c +++ b/drivers/pci/hotplug/shpchp_hpc.c | |||
| @@ -82,31 +82,6 @@ | |||
| 82 | #define SLOT_100MHZ_PCIX_533 0x0f000000 | 82 | #define SLOT_100MHZ_PCIX_533 0x0f000000 |
| 83 | #define SLOT_133MHZ_PCIX_533 0xf0000000 | 83 | #define SLOT_133MHZ_PCIX_533 0xf0000000 |
| 84 | 84 | ||
| 85 | |||
| 86 | /* Secondary Bus Configuration Register */ | ||
| 87 | /* For PI = 1, Bits 0 to 2 have been encoded as follows to show current bus speed/mode */ | ||
| 88 | #define PCI_33MHZ 0x0 | ||
| 89 | #define PCI_66MHZ 0x1 | ||
| 90 | #define PCIX_66MHZ 0x2 | ||
| 91 | #define PCIX_100MHZ 0x3 | ||
| 92 | #define PCIX_133MHZ 0x4 | ||
| 93 | |||
| 94 | /* For PI = 2, Bits 0 to 3 have been encoded as follows to show current bus speed/mode */ | ||
| 95 | #define PCI_33MHZ 0x0 | ||
| 96 | #define PCI_66MHZ 0x1 | ||
| 97 | #define PCIX_66MHZ 0x2 | ||
| 98 | #define PCIX_100MHZ 0x3 | ||
| 99 | #define PCIX_133MHZ 0x4 | ||
| 100 | #define PCIX_66MHZ_ECC 0x5 | ||
| 101 | #define PCIX_100MHZ_ECC 0x6 | ||
| 102 | #define PCIX_133MHZ_ECC 0x7 | ||
| 103 | #define PCIX_66MHZ_266 0x9 | ||
| 104 | #define PCIX_100MHZ_266 0xa | ||
| 105 | #define PCIX_133MHZ_266 0xb | ||
| 106 | #define PCIX_66MHZ_533 0x11 | ||
| 107 | #define PCIX_100MHZ_533 0x12 | ||
| 108 | #define PCIX_133MHZ_533 0x13 | ||
| 109 | |||
| 110 | /* Slot Configuration */ | 85 | /* Slot Configuration */ |
| 111 | #define SLOT_NUM 0x0000001F | 86 | #define SLOT_NUM 0x0000001F |
| 112 | #define FIRST_DEV_NUM 0x00001F00 | 87 | #define FIRST_DEV_NUM 0x00001F00 |
| @@ -548,81 +523,41 @@ static int hpc_get_prog_int(struct slot *slot, u8 *prog_int) | |||
| 548 | 523 | ||
| 549 | static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value) | 524 | static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value) |
| 550 | { | 525 | { |
| 551 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; | ||
| 552 | u32 slot_reg; | ||
| 553 | u16 slot_status, sec_bus_status; | ||
| 554 | u8 m66_cap, pcix_cap, pi; | ||
| 555 | int retval = 0; | 526 | int retval = 0; |
| 527 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; | ||
| 528 | u32 slot_reg = readl(php_ctlr->creg + SLOT1 + 4 * slot->hp_slot); | ||
| 529 | u8 pcix_cap = (slot_reg >> 12) & 7; | ||
| 530 | u8 m66_cap = (slot_reg >> 9) & 1; | ||
| 556 | 531 | ||
| 557 | DBG_ENTER_ROUTINE | 532 | DBG_ENTER_ROUTINE |
| 558 | 533 | ||
| 559 | if (!slot->ctrl->hpc_ctlr_handle) { | 534 | dbg("%s: slot_reg = %x, pcix_cap = %x, m66_cap = %x\n", |
| 560 | err("%s: Invalid HPC controller handle!\n", __FUNCTION__); | 535 | __FUNCTION__, slot_reg, pcix_cap, m66_cap); |
| 561 | return -1; | ||
| 562 | } | ||
| 563 | |||
| 564 | if (slot->hp_slot >= php_ctlr->num_slots) { | ||
| 565 | err("%s: Invalid HPC slot number!\n", __FUNCTION__); | ||
| 566 | return -1; | ||
| 567 | } | ||
| 568 | |||
| 569 | pi = readb(php_ctlr->creg + PROG_INTERFACE); | ||
| 570 | slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); | ||
| 571 | dbg("%s: pi = %d, slot_reg = %x\n", __FUNCTION__, pi, slot_reg); | ||
| 572 | slot_status = (u16) slot_reg; | ||
| 573 | dbg("%s: slot_status = %x\n", __FUNCTION__, slot_status); | ||
| 574 | sec_bus_status = readw(php_ctlr->creg + SEC_BUS_CONFIG); | ||
| 575 | |||
| 576 | pcix_cap = (u8) ((slot_status & 0x3000) >> 12); | ||
| 577 | dbg("%s: pcix_cap = %x\n", __FUNCTION__, pcix_cap); | ||
| 578 | m66_cap = (u8) ((slot_status & 0x0200) >> 9); | ||
| 579 | dbg("%s: m66_cap = %x\n", __FUNCTION__, m66_cap); | ||
| 580 | 536 | ||
| 581 | 537 | switch (pcix_cap) { | |
| 582 | if (pi == 2) { | 538 | case 0x0: |
| 583 | switch (pcix_cap) { | 539 | *value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz; |
| 584 | case 0: | 540 | break; |
| 585 | *value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz; | 541 | case 0x1: |
| 586 | break; | 542 | *value = PCI_SPEED_66MHz_PCIX; |
| 587 | case 1: | 543 | break; |
| 588 | *value = PCI_SPEED_66MHz_PCIX; | 544 | case 0x3: |
| 589 | break; | 545 | *value = PCI_SPEED_133MHz_PCIX; |
| 590 | case 3: | 546 | break; |
| 591 | *value = PCI_SPEED_133MHz_PCIX; | 547 | case 0x4: |
| 592 | break; | 548 | *value = PCI_SPEED_133MHz_PCIX_266; |
| 593 | case 4: | 549 | break; |
| 594 | *value = PCI_SPEED_133MHz_PCIX_266; | 550 | case 0x5: |
| 595 | break; | 551 | *value = PCI_SPEED_133MHz_PCIX_533; |
| 596 | case 5: | 552 | break; |
| 597 | *value = PCI_SPEED_133MHz_PCIX_533; | 553 | case 0x2: |
| 598 | break; | 554 | default: |
| 599 | case 2: /* Reserved */ | 555 | *value = PCI_SPEED_UNKNOWN; |
| 600 | default: | 556 | retval = -ENODEV; |
| 601 | *value = PCI_SPEED_UNKNOWN; | 557 | break; |
| 602 | retval = -ENODEV; | ||
| 603 | break; | ||
| 604 | } | ||
| 605 | } else { | ||
| 606 | switch (pcix_cap) { | ||
| 607 | case 0: | ||
| 608 | *value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz; | ||
| 609 | break; | ||
| 610 | case 1: | ||
| 611 | *value = PCI_SPEED_66MHz_PCIX; | ||
| 612 | break; | ||
| 613 | case 3: | ||
| 614 | *value = PCI_SPEED_133MHz_PCIX; | ||
| 615 | break; | ||
| 616 | case 2: /* Reserved */ | ||
| 617 | default: | ||
| 618 | *value = PCI_SPEED_UNKNOWN; | ||
| 619 | retval = -ENODEV; | ||
| 620 | break; | ||
| 621 | } | ||
| 622 | } | 558 | } |
| 623 | 559 | ||
| 624 | dbg("Adapter speed = %d\n", *value); | 560 | dbg("Adapter speed = %d\n", *value); |
| 625 | |||
| 626 | DBG_LEAVE_ROUTINE | 561 | DBG_LEAVE_ROUTINE |
| 627 | return retval; | 562 | return retval; |
| 628 | } | 563 | } |
| @@ -965,98 +900,66 @@ static int hpc_slot_disable(struct slot * slot) | |||
| 965 | 900 | ||
| 966 | static int hpc_set_bus_speed_mode(struct slot * slot, enum pci_bus_speed value) | 901 | static int hpc_set_bus_speed_mode(struct slot * slot, enum pci_bus_speed value) |
| 967 | { | 902 | { |
| 968 | u8 slot_cmd; | 903 | int retval; |
| 969 | u8 pi; | ||
| 970 | int retval = 0; | ||
| 971 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; | 904 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; |
| 905 | u8 pi, cmd; | ||
| 972 | 906 | ||
| 973 | DBG_ENTER_ROUTINE | 907 | DBG_ENTER_ROUTINE |
| 974 | |||
| 975 | if (!slot->ctrl->hpc_ctlr_handle) { | ||
| 976 | err("%s: Invalid HPC controller handle!\n", __FUNCTION__); | ||
| 977 | return -1; | ||
| 978 | } | ||
| 979 | 908 | ||
| 980 | pi = readb(php_ctlr->creg + PROG_INTERFACE); | 909 | pi = readb(php_ctlr->creg + PROG_INTERFACE); |
| 981 | 910 | if ((pi == 1) && (value > PCI_SPEED_133MHz_PCIX)) | |
| 982 | if (pi == 1) { | 911 | return -EINVAL; |
| 983 | switch (value) { | ||
| 984 | case 0: | ||
| 985 | slot_cmd = SETA_PCI_33MHZ; | ||
| 986 | break; | ||
| 987 | case 1: | ||
| 988 | slot_cmd = SETA_PCI_66MHZ; | ||
| 989 | break; | ||
| 990 | case 2: | ||
| 991 | slot_cmd = SETA_PCIX_66MHZ; | ||
| 992 | break; | ||
| 993 | case 3: | ||
| 994 | slot_cmd = SETA_PCIX_100MHZ; | ||
| 995 | break; | ||
| 996 | case 4: | ||
| 997 | slot_cmd = SETA_PCIX_133MHZ; | ||
| 998 | break; | ||
| 999 | default: | ||
| 1000 | slot_cmd = PCI_SPEED_UNKNOWN; | ||
| 1001 | retval = -ENODEV; | ||
| 1002 | return retval; | ||
| 1003 | } | ||
| 1004 | } else { | ||
| 1005 | switch (value) { | ||
| 1006 | case 0: | ||
| 1007 | slot_cmd = SETB_PCI_33MHZ; | ||
| 1008 | break; | ||
| 1009 | case 1: | ||
| 1010 | slot_cmd = SETB_PCI_66MHZ; | ||
| 1011 | break; | ||
| 1012 | case 2: | ||
| 1013 | slot_cmd = SETB_PCIX_66MHZ_PM; | ||
| 1014 | break; | ||
| 1015 | case 3: | ||
| 1016 | slot_cmd = SETB_PCIX_100MHZ_PM; | ||
| 1017 | break; | ||
| 1018 | case 4: | ||
| 1019 | slot_cmd = SETB_PCIX_133MHZ_PM; | ||
| 1020 | break; | ||
| 1021 | case 5: | ||
| 1022 | slot_cmd = SETB_PCIX_66MHZ_EM; | ||
| 1023 | break; | ||
| 1024 | case 6: | ||
| 1025 | slot_cmd = SETB_PCIX_100MHZ_EM; | ||
| 1026 | break; | ||
| 1027 | case 7: | ||
| 1028 | slot_cmd = SETB_PCIX_133MHZ_EM; | ||
| 1029 | break; | ||
| 1030 | case 8: | ||
| 1031 | slot_cmd = SETB_PCIX_66MHZ_266; | ||
| 1032 | break; | ||
| 1033 | case 0x9: | ||
| 1034 | slot_cmd = SETB_PCIX_100MHZ_266; | ||
| 1035 | break; | ||
| 1036 | case 0xa: | ||
| 1037 | slot_cmd = SETB_PCIX_133MHZ_266; | ||
| 1038 | break; | ||
| 1039 | case 0xb: | ||
| 1040 | slot_cmd = SETB_PCIX_66MHZ_533; | ||
| 1041 | break; | ||
| 1042 | case 0xc: | ||
| 1043 | slot_cmd = SETB_PCIX_100MHZ_533; | ||
| 1044 | break; | ||
| 1045 | case 0xd: | ||
| 1046 | slot_cmd = SETB_PCIX_133MHZ_533; | ||
| 1047 | break; | ||
| 1048 | default: | ||
| 1049 | slot_cmd = PCI_SPEED_UNKNOWN; | ||
| 1050 | retval = -ENODEV; | ||
| 1051 | return retval; | ||
| 1052 | } | ||
| 1053 | 912 | ||
| 913 | switch (value) { | ||
| 914 | case PCI_SPEED_33MHz: | ||
| 915 | cmd = SETA_PCI_33MHZ; | ||
| 916 | break; | ||
| 917 | case PCI_SPEED_66MHz: | ||
| 918 | cmd = SETA_PCI_66MHZ; | ||
| 919 | break; | ||
| 920 | case PCI_SPEED_66MHz_PCIX: | ||
| 921 | cmd = SETA_PCIX_66MHZ; | ||
| 922 | break; | ||
| 923 | case PCI_SPEED_100MHz_PCIX: | ||
| 924 | cmd = SETA_PCIX_100MHZ; | ||
| 925 | break; | ||
| 926 | case PCI_SPEED_133MHz_PCIX: | ||
| 927 | cmd = SETA_PCIX_133MHZ; | ||
| 928 | break; | ||
| 929 | case PCI_SPEED_66MHz_PCIX_ECC: | ||
| 930 | cmd = SETB_PCIX_66MHZ_EM; | ||
| 931 | break; | ||
| 932 | case PCI_SPEED_100MHz_PCIX_ECC: | ||
| 933 | cmd = SETB_PCIX_100MHZ_EM; | ||
| 934 | break; | ||
| 935 | case PCI_SPEED_133MHz_PCIX_ECC: | ||
| 936 | cmd = SETB_PCIX_133MHZ_EM; | ||
| 937 | break; | ||
| 938 | case PCI_SPEED_66MHz_PCIX_266: | ||
| 939 | cmd = SETB_PCIX_66MHZ_266; | ||
| 940 | break; | ||
| 941 | case PCI_SPEED_100MHz_PCIX_266: | ||
| 942 | cmd = SETB_PCIX_100MHZ_266; | ||
| 943 | break; | ||
| 944 | case PCI_SPEED_133MHz_PCIX_266: | ||
| 945 | cmd = SETB_PCIX_133MHZ_266; | ||
| 946 | break; | ||
| 947 | case PCI_SPEED_66MHz_PCIX_533: | ||
| 948 | cmd = SETB_PCIX_66MHZ_533; | ||
| 949 | break; | ||
| 950 | case PCI_SPEED_100MHz_PCIX_533: | ||
| 951 | cmd = SETB_PCIX_100MHZ_533; | ||
| 952 | break; | ||
| 953 | case PCI_SPEED_133MHz_PCIX_533: | ||
| 954 | cmd = SETB_PCIX_133MHZ_533; | ||
| 955 | break; | ||
| 956 | default: | ||
| 957 | return -EINVAL; | ||
| 1054 | } | 958 | } |
| 1055 | retval = shpc_write_cmd(slot, 0, slot_cmd); | 959 | |
| 1056 | if (retval) { | 960 | retval = shpc_write_cmd(slot, 0, cmd); |
| 961 | if (retval) | ||
| 1057 | err("%s: Write command failed!\n", __FUNCTION__); | 962 | err("%s: Write command failed!\n", __FUNCTION__); |
| 1058 | return -1; | ||
| 1059 | } | ||
| 1060 | 963 | ||
| 1061 | DBG_LEAVE_ROUTINE | 964 | DBG_LEAVE_ROUTINE |
| 1062 | return retval; | 965 | return retval; |
| @@ -1163,64 +1066,43 @@ static irqreturn_t shpc_isr(int IRQ, void *dev_id, struct pt_regs *regs) | |||
| 1163 | 1066 | ||
| 1164 | static int hpc_get_max_bus_speed (struct slot *slot, enum pci_bus_speed *value) | 1067 | static int hpc_get_max_bus_speed (struct slot *slot, enum pci_bus_speed *value) |
| 1165 | { | 1068 | { |
| 1069 | int retval = 0; | ||
| 1166 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; | 1070 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; |
| 1167 | enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; | 1071 | enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; |
| 1168 | int retval = 0; | 1072 | u8 pi = readb(php_ctlr->creg + PROG_INTERFACE); |
| 1169 | u8 pi; | 1073 | u32 slot_avail1 = readl(php_ctlr->creg + SLOT_AVAIL1); |
| 1170 | u32 slot_avail1, slot_avail2; | 1074 | u32 slot_avail2 = readl(php_ctlr->creg + SLOT_AVAIL2); |
| 1171 | 1075 | ||
| 1172 | DBG_ENTER_ROUTINE | 1076 | DBG_ENTER_ROUTINE |
| 1173 | 1077 | ||
| 1174 | if (!slot->ctrl->hpc_ctlr_handle) { | ||
| 1175 | err("%s: Invalid HPC controller handle!\n", __FUNCTION__); | ||
| 1176 | return -1; | ||
| 1177 | } | ||
| 1178 | |||
| 1179 | if (slot->hp_slot >= php_ctlr->num_slots) { | ||
| 1180 | err("%s: Invalid HPC slot number!\n", __FUNCTION__); | ||
| 1181 | return -1; | ||
| 1182 | } | ||
| 1183 | |||
| 1184 | pi = readb(php_ctlr->creg + PROG_INTERFACE); | ||
| 1185 | slot_avail1 = readl(php_ctlr->creg + SLOT_AVAIL1); | ||
| 1186 | slot_avail2 = readl(php_ctlr->creg + SLOT_AVAIL2); | ||
| 1187 | |||
| 1188 | if (pi == 2) { | 1078 | if (pi == 2) { |
| 1189 | if (slot_avail2 & SLOT_133MHZ_PCIX_533) | 1079 | if (slot_avail2 & SLOT_133MHZ_PCIX_533) |
| 1190 | bus_speed = PCIX_133MHZ_533; | 1080 | bus_speed = PCI_SPEED_133MHz_PCIX_533; |
| 1191 | else if (slot_avail2 & SLOT_100MHZ_PCIX_533) | 1081 | else if (slot_avail2 & SLOT_100MHZ_PCIX_533) |
| 1192 | bus_speed = PCIX_100MHZ_533; | 1082 | bus_speed = PCI_SPEED_100MHz_PCIX_533; |
| 1193 | else if (slot_avail2 & SLOT_66MHZ_PCIX_533) | 1083 | else if (slot_avail2 & SLOT_66MHZ_PCIX_533) |
| 1194 | bus_speed = PCIX_66MHZ_533; | 1084 | bus_speed = PCI_SPEED_66MHz_PCIX_533; |
| 1195 | else if (slot_avail2 & SLOT_133MHZ_PCIX_266) | 1085 | else if (slot_avail2 & SLOT_133MHZ_PCIX_266) |
| 1196 | bus_speed = PCIX_133MHZ_266; | 1086 | bus_speed = PCI_SPEED_133MHz_PCIX_266; |
| 1197 | else if (slot_avail2 & SLOT_100MHZ_PCIX_266) | 1087 | else if (slot_avail2 & SLOT_100MHZ_PCIX_266) |
| 1198 | bus_speed = PCIX_100MHZ_266; | 1088 | bus_speed = PCI_SPEED_100MHz_PCIX_266; |
| 1199 | else if (slot_avail2 & SLOT_66MHZ_PCIX_266) | 1089 | else if (slot_avail2 & SLOT_66MHZ_PCIX_266) |
| 1200 | bus_speed = PCIX_66MHZ_266; | 1090 | bus_speed = PCI_SPEED_66MHz_PCIX_266; |
| 1201 | else if (slot_avail1 & SLOT_133MHZ_PCIX) | 1091 | } |
| 1202 | bus_speed = PCIX_133MHZ; | 1092 | |
| 1203 | else if (slot_avail1 & SLOT_100MHZ_PCIX) | 1093 | if (bus_speed == PCI_SPEED_UNKNOWN) { |
| 1204 | bus_speed = PCIX_100MHZ; | ||
| 1205 | else if (slot_avail1 & SLOT_66MHZ_PCIX) | ||
| 1206 | bus_speed = PCIX_66MHZ; | ||
| 1207 | else if (slot_avail2 & SLOT_66MHZ) | ||
| 1208 | bus_speed = PCI_66MHZ; | ||
| 1209 | else if (slot_avail1 & SLOT_33MHZ) | ||
| 1210 | bus_speed = PCI_33MHZ; | ||
| 1211 | else bus_speed = PCI_SPEED_UNKNOWN; | ||
| 1212 | } else { | ||
| 1213 | if (slot_avail1 & SLOT_133MHZ_PCIX) | 1094 | if (slot_avail1 & SLOT_133MHZ_PCIX) |
| 1214 | bus_speed = PCIX_133MHZ; | 1095 | bus_speed = PCI_SPEED_133MHz_PCIX; |
| 1215 | else if (slot_avail1 & SLOT_100MHZ_PCIX) | 1096 | else if (slot_avail1 & SLOT_100MHZ_PCIX) |
| 1216 | bus_speed = PCIX_100MHZ; | 1097 | bus_speed = PCI_SPEED_100MHz_PCIX; |
| 1217 | else if (slot_avail1 & SLOT_66MHZ_PCIX) | 1098 | else if (slot_avail1 & SLOT_66MHZ_PCIX) |
| 1218 | bus_speed = PCIX_66MHZ; | 1099 | bus_speed = PCI_SPEED_66MHz_PCIX; |
| 1219 | else if (slot_avail2 & SLOT_66MHZ) | 1100 | else if (slot_avail2 & SLOT_66MHZ) |
| 1220 | bus_speed = PCI_66MHZ; | 1101 | bus_speed = PCI_SPEED_66MHz; |
| 1221 | else if (slot_avail1 & SLOT_33MHZ) | 1102 | else if (slot_avail1 & SLOT_33MHZ) |
| 1222 | bus_speed = PCI_33MHZ; | 1103 | bus_speed = PCI_SPEED_33MHz; |
| 1223 | else bus_speed = PCI_SPEED_UNKNOWN; | 1104 | else |
| 1105 | retval = -ENODEV; | ||
| 1224 | } | 1106 | } |
| 1225 | 1107 | ||
| 1226 | *value = bus_speed; | 1108 | *value = bus_speed; |
| @@ -1231,111 +1113,69 @@ static int hpc_get_max_bus_speed (struct slot *slot, enum pci_bus_speed *value) | |||
| 1231 | 1113 | ||
| 1232 | static int hpc_get_cur_bus_speed (struct slot *slot, enum pci_bus_speed *value) | 1114 | static int hpc_get_cur_bus_speed (struct slot *slot, enum pci_bus_speed *value) |
| 1233 | { | 1115 | { |
| 1116 | int retval = 0; | ||
| 1234 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; | 1117 | struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; |
| 1235 | enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; | 1118 | enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; |
| 1236 | u16 sec_bus_status; | 1119 | u16 sec_bus_reg = readw(php_ctlr->creg + SEC_BUS_CONFIG); |
| 1237 | int retval = 0; | 1120 | u8 pi = readb(php_ctlr->creg + PROG_INTERFACE); |
| 1238 | u8 pi; | 1121 | u8 speed_mode = (pi == 2) ? (sec_bus_reg & 0xF) : (sec_bus_reg & 0x7); |
| 1239 | 1122 | ||
| 1240 | DBG_ENTER_ROUTINE | 1123 | DBG_ENTER_ROUTINE |
| 1241 | 1124 | ||
| 1242 | if (!slot->ctrl->hpc_ctlr_handle) { | 1125 | if ((pi == 1) && (speed_mode > 4)) { |
| 1243 | err("%s: Invalid HPC controller handle!\n", __FUNCTION__); | 1126 | *value = PCI_SPEED_UNKNOWN; |
| 1244 | return -1; | 1127 | return -ENODEV; |
| 1245 | } | ||
| 1246 | |||
| 1247 | if (slot->hp_slot >= php_ctlr->num_slots) { | ||
| 1248 | err("%s: Invalid HPC slot number!\n", __FUNCTION__); | ||
| 1249 | return -1; | ||
| 1250 | } | 1128 | } |
| 1251 | 1129 | ||
| 1252 | pi = readb(php_ctlr->creg + PROG_INTERFACE); | 1130 | switch (speed_mode) { |
| 1253 | sec_bus_status = readw(php_ctlr->creg + SEC_BUS_CONFIG); | 1131 | case 0x0: |
| 1254 | 1132 | *value = PCI_SPEED_33MHz; | |
| 1255 | if (pi == 2) { | 1133 | break; |
| 1256 | switch (sec_bus_status & 0x000f) { | 1134 | case 0x1: |
| 1257 | case 0: | 1135 | *value = PCI_SPEED_66MHz; |
| 1258 | bus_speed = PCI_SPEED_33MHz; | 1136 | break; |
| 1259 | break; | 1137 | case 0x2: |
| 1260 | case 1: | 1138 | *value = PCI_SPEED_66MHz_PCIX; |
| 1261 | bus_speed = PCI_SPEED_66MHz; | 1139 | break; |
| 1262 | break; | 1140 | case 0x3: |
| 1263 | case 2: | 1141 | *value = PCI_SPEED_100MHz_PCIX; |
| 1264 | bus_speed = PCI_SPEED_66MHz_PCIX; | 1142 | break; |
| 1265 | break; | 1143 | case 0x4: |
| 1266 | case 3: | 1144 | *value = PCI_SPEED_133MHz_PCIX; |
| 1267 | bus_speed = PCI_SPEED_100MHz_PCIX; | 1145 | break; |
| 1268 | break; | 1146 | case 0x5: |
| 1269 | case 4: | 1147 | *value = PCI_SPEED_66MHz_PCIX_ECC; |
| 1270 | bus_speed = PCI_SPEED_133MHz_PCIX; | 1148 | break; |
| 1271 | break; | 1149 | case 0x6: |
| 1272 | case 5: | 1150 | *value = PCI_SPEED_100MHz_PCIX_ECC; |
| 1273 | bus_speed = PCI_SPEED_66MHz_PCIX_ECC; | 1151 | break; |
| 1274 | break; | 1152 | case 0x7: |
| 1275 | case 6: | 1153 | *value = PCI_SPEED_133MHz_PCIX_ECC; |
| 1276 | bus_speed = PCI_SPEED_100MHz_PCIX_ECC; | 1154 | break; |
| 1277 | break; | 1155 | case 0x8: |
| 1278 | case 7: | 1156 | *value = PCI_SPEED_66MHz_PCIX_266; |
| 1279 | bus_speed = PCI_SPEED_133MHz_PCIX_ECC; | 1157 | break; |
| 1280 | break; | 1158 | case 0x9: |
| 1281 | case 8: | 1159 | *value = PCI_SPEED_100MHz_PCIX_266; |
| 1282 | bus_speed = PCI_SPEED_66MHz_PCIX_266; | 1160 | break; |
| 1283 | break; | 1161 | case 0xa: |
| 1284 | case 9: | 1162 | *value = PCI_SPEED_133MHz_PCIX_266; |
| 1285 | bus_speed = PCI_SPEED_100MHz_PCIX_266; | 1163 | break; |
| 1286 | break; | 1164 | case 0xb: |
| 1287 | case 0xa: | 1165 | *value = PCI_SPEED_66MHz_PCIX_533; |
| 1288 | bus_speed = PCI_SPEED_133MHz_PCIX_266; | 1166 | break; |
| 1289 | break; | 1167 | case 0xc: |
| 1290 | case 0xb: | 1168 | *value = PCI_SPEED_100MHz_PCIX_533; |
| 1291 | bus_speed = PCI_SPEED_66MHz_PCIX_533; | 1169 | break; |
| 1292 | break; | 1170 | case 0xd: |
| 1293 | case 0xc: | 1171 | *value = PCI_SPEED_133MHz_PCIX_533; |
| 1294 | bus_speed = PCI_SPEED_100MHz_PCIX_533; | 1172 | break; |
| 1295 | break; | 1173 | default: |
| 1296 | case 0xd: | 1174 | *value = PCI_SPEED_UNKNOWN; |
| 1297 | bus_speed = PCI_SPEED_133MHz_PCIX_533; | 1175 | retval = -ENODEV; |
| 1298 | break; | 1176 | break; |
| 1299 | case 0xe: | ||
| 1300 | case 0xf: | ||
| 1301 | default: | ||
| 1302 | bus_speed = PCI_SPEED_UNKNOWN; | ||
| 1303 | break; | ||
| 1304 | } | ||
| 1305 | } else { | ||
| 1306 | /* In the case where pi is undefined, default it to 1 */ | ||
| 1307 | switch (sec_bus_status & 0x0007) { | ||
| 1308 | case 0: | ||
| 1309 | bus_speed = PCI_SPEED_33MHz; | ||
| 1310 | break; | ||
| 1311 | case 1: | ||
| 1312 | bus_speed = PCI_SPEED_66MHz; | ||
| 1313 | break; | ||
| 1314 | case 2: | ||
| 1315 | bus_speed = PCI_SPEED_66MHz_PCIX; | ||
| 1316 | break; | ||
| 1317 | case 3: | ||
| 1318 | bus_speed = PCI_SPEED_100MHz_PCIX; | ||
| 1319 | break; | ||
| 1320 | case 4: | ||
| 1321 | bus_speed = PCI_SPEED_133MHz_PCIX; | ||
| 1322 | break; | ||
| 1323 | case 5: | ||
| 1324 | bus_speed = PCI_SPEED_UNKNOWN; /* Reserved */ | ||
| 1325 | break; | ||
| 1326 | case 6: | ||
| 1327 | bus_speed = PCI_SPEED_UNKNOWN; /* Reserved */ | ||
| 1328 | break; | ||
| 1329 | case 7: | ||
| 1330 | bus_speed = PCI_SPEED_UNKNOWN; /* Reserved */ | ||
| 1331 | break; | ||
| 1332 | default: | ||
| 1333 | bus_speed = PCI_SPEED_UNKNOWN; | ||
| 1334 | break; | ||
| 1335 | } | ||
| 1336 | } | 1177 | } |
| 1337 | 1178 | ||
| 1338 | *value = bus_speed; | ||
| 1339 | dbg("Current bus speed = %d\n", bus_speed); | 1179 | dbg("Current bus speed = %d\n", bus_speed); |
| 1340 | DBG_LEAVE_ROUTINE | 1180 | DBG_LEAVE_ROUTINE |
| 1341 | return retval; | 1181 | return retval; |
