host.c (ae904d15cf344bcb426f63982016f6bacc45825b) host.c (abec912d71c44bbd642ce12ad98aab76f5a53163)
1/*
2 * This file is provided under a dual BSD/GPLv2 license. When using or
3 * redistributing this file, you may do so under either license.
4 *
5 * GPL LICENSE SUMMARY
6 *
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8 *

--- 1060 unchanged lines hidden (view full) ---

1069/**
1070 * isci_host_completion_routine() - This function is the delayed service
1071 * routine that calls the sci core library's completion handler. It's
1072 * scheduled as a tasklet from the interrupt service routine when interrupts
1073 * in use, or set as the timeout function in polled mode.
1074 * @data: This parameter specifies the ISCI host object
1075 *
1076 */
1/*
2 * This file is provided under a dual BSD/GPLv2 license. When using or
3 * redistributing this file, you may do so under either license.
4 *
5 * GPL LICENSE SUMMARY
6 *
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8 *

--- 1060 unchanged lines hidden (view full) ---

1069/**
1070 * isci_host_completion_routine() - This function is the delayed service
1071 * routine that calls the sci core library's completion handler. It's
1072 * scheduled as a tasklet from the interrupt service routine when interrupts
1073 * in use, or set as the timeout function in polled mode.
1074 * @data: This parameter specifies the ISCI host object
1075 *
1076 */
1077static void isci_host_completion_routine(unsigned long data)
1077void isci_host_completion_routine(unsigned long data)
1078{
1079 struct isci_host *ihost = (struct isci_host *)data;
1080 struct list_head completed_request_list;
1081 struct list_head errored_request_list;
1082 struct list_head *current_position;
1083 struct list_head *next_position;
1084 struct isci_request *request;
1085 struct isci_request *next_request;

--- 226 unchanged lines hidden (view full) ---

1312static void __iomem *smu_base(struct isci_host *isci_host)
1313{
1314 struct pci_dev *pdev = isci_host->pdev;
1315 int id = isci_host->id;
1316
1317 return pcim_iomap_table(pdev)[SCI_SMU_BAR * 2] + SCI_SMU_BAR_SIZE * id;
1318}
1319
1078{
1079 struct isci_host *ihost = (struct isci_host *)data;
1080 struct list_head completed_request_list;
1081 struct list_head errored_request_list;
1082 struct list_head *current_position;
1083 struct list_head *next_position;
1084 struct isci_request *request;
1085 struct isci_request *next_request;

--- 226 unchanged lines hidden (view full) ---

1312static void __iomem *smu_base(struct isci_host *isci_host)
1313{
1314 struct pci_dev *pdev = isci_host->pdev;
1315 int id = isci_host->id;
1316
1317 return pcim_iomap_table(pdev)[SCI_SMU_BAR * 2] + SCI_SMU_BAR_SIZE * id;
1318}
1319
1320static void isci_user_parameters_get(struct sci_user_parameters *u)
1321{
1322 int i;
1323
1324 for (i = 0; i < SCI_MAX_PHYS; i++) {
1325 struct sci_phy_user_params *u_phy = &u->phys[i];
1326
1327 u_phy->max_speed_generation = phy_gen;
1328
1329 /* we are not exporting these for now */
1330 u_phy->align_insertion_frequency = 0x7f;
1331 u_phy->in_connection_align_insertion_frequency = 0xff;
1332 u_phy->notify_enable_spin_up_insertion_frequency = 0x33;
1333 }
1334
1335 u->stp_inactivity_timeout = stp_inactive_to;
1336 u->ssp_inactivity_timeout = ssp_inactive_to;
1337 u->stp_max_occupancy_timeout = stp_max_occ_to;
1338 u->ssp_max_occupancy_timeout = ssp_max_occ_to;
1339 u->no_outbound_task_timeout = no_outbound_task_to;
1340 u->max_concurr_spinup = max_concurr_spinup;
1341}
1342
1343static void sci_controller_initial_state_enter(struct sci_base_state_machine *sm)
1344{
1345 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm);
1346
1347 sci_change_state(&ihost->sm, SCIC_RESET);
1348}
1349
1350static inline void sci_controller_starting_state_exit(struct sci_base_state_machine *sm)

--- 292 unchanged lines hidden (view full) ---

1643 [SCIC_STOPPING] = {
1644 .enter_state = sci_controller_stopping_state_enter,
1645 .exit_state = sci_controller_stopping_state_exit,
1646 },
1647 [SCIC_STOPPED] = {},
1648 [SCIC_FAILED] = {}
1649};
1650
1320static void sci_controller_initial_state_enter(struct sci_base_state_machine *sm)
1321{
1322 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm);
1323
1324 sci_change_state(&ihost->sm, SCIC_RESET);
1325}
1326
1327static inline void sci_controller_starting_state_exit(struct sci_base_state_machine *sm)

--- 292 unchanged lines hidden (view full) ---

1620 [SCIC_STOPPING] = {
1621 .enter_state = sci_controller_stopping_state_enter,
1622 .exit_state = sci_controller_stopping_state_exit,
1623 },
1624 [SCIC_STOPPED] = {},
1625 [SCIC_FAILED] = {}
1626};
1627
1651static void sci_controller_set_default_config_parameters(struct isci_host *ihost)
1652{
1653 /* these defaults are overridden by the platform / firmware */
1654 u16 index;
1655
1656 /* Default to APC mode. */
1657 ihost->oem_parameters.controller.mode_type = SCIC_PORT_AUTOMATIC_CONFIGURATION_MODE;
1658
1659 /* Default to APC mode. */
1660 ihost->oem_parameters.controller.max_concurr_spin_up = 1;
1661
1662 /* Default to no SSC operation. */
1663 ihost->oem_parameters.controller.do_enable_ssc = false;
1664
1665 /* Default to short cables on all phys. */
1666 ihost->oem_parameters.controller.cable_selection_mask = 0;
1667
1668 /* Initialize all of the port parameter information to narrow ports. */
1669 for (index = 0; index < SCI_MAX_PORTS; index++) {
1670 ihost->oem_parameters.ports[index].phy_mask = 0;
1671 }
1672
1673 /* Initialize all of the phy parameter information. */
1674 for (index = 0; index < SCI_MAX_PHYS; index++) {
1675 /* Default to 3G (i.e. Gen 2). */
1676 ihost->user_parameters.phys[index].max_speed_generation =
1677 SCIC_SDS_PARM_GEN2_SPEED;
1678
1679 /* the frequencies cannot be 0 */
1680 ihost->user_parameters.phys[index].align_insertion_frequency = 0x7f;
1681 ihost->user_parameters.phys[index].in_connection_align_insertion_frequency = 0xff;
1682 ihost->user_parameters.phys[index].notify_enable_spin_up_insertion_frequency = 0x33;
1683
1684 /*
1685 * Previous Vitesse based expanders had a arbitration issue that
1686 * is worked around by having the upper 32-bits of SAS address
1687 * with a value greater then the Vitesse company identifier.
1688 * Hence, usage of 0x5FCFFFFF. */
1689 ihost->oem_parameters.phys[index].sas_address.low = 0x1 + ihost->id;
1690 ihost->oem_parameters.phys[index].sas_address.high = 0x5FCFFFFF;
1691 }
1692
1693 ihost->user_parameters.stp_inactivity_timeout = 5;
1694 ihost->user_parameters.ssp_inactivity_timeout = 5;
1695 ihost->user_parameters.stp_max_occupancy_timeout = 5;
1696 ihost->user_parameters.ssp_max_occupancy_timeout = 20;
1697 ihost->user_parameters.no_outbound_task_timeout = 2;
1698}
1699
1700static void controller_timeout(unsigned long data)
1701{
1702 struct sci_timer *tmr = (struct sci_timer *)data;
1703 struct isci_host *ihost = container_of(tmr, typeof(*ihost), timer);
1704 struct sci_base_state_machine *sm = &ihost->sm;
1705 unsigned long flags;
1706
1707 spin_lock_irqsave(&ihost->scic_lock, flags);

--- 40 unchanged lines hidden (view full) ---

1748 sci_phy_construct(&ihost->phys[i],
1749 &ihost->ports[SCI_MAX_PORTS], i);
1750 }
1751
1752 ihost->invalid_phy_mask = 0;
1753
1754 sci_init_timer(&ihost->timer, controller_timeout);
1755
1628static void controller_timeout(unsigned long data)
1629{
1630 struct sci_timer *tmr = (struct sci_timer *)data;
1631 struct isci_host *ihost = container_of(tmr, typeof(*ihost), timer);
1632 struct sci_base_state_machine *sm = &ihost->sm;
1633 unsigned long flags;
1634
1635 spin_lock_irqsave(&ihost->scic_lock, flags);

--- 40 unchanged lines hidden (view full) ---

1676 sci_phy_construct(&ihost->phys[i],
1677 &ihost->ports[SCI_MAX_PORTS], i);
1678 }
1679
1680 ihost->invalid_phy_mask = 0;
1681
1682 sci_init_timer(&ihost->timer, controller_timeout);
1683
1756 /* Initialize the User and OEM parameters to default values. */
1757 sci_controller_set_default_config_parameters(ihost);
1758
1759 return sci_controller_reset(ihost);
1760}
1761
1762int sci_oem_parameters_validate(struct sci_oem_params *oem, u8 version)
1763{
1764 int i;
1765
1766 for (i = 0; i < SCI_MAX_PORTS; i++)

--- 63 unchanged lines hidden (view full) ---

1830 }
1831 }
1832 }
1833 }
1834
1835 return 0;
1836}
1837
1684 return sci_controller_reset(ihost);
1685}
1686
1687int sci_oem_parameters_validate(struct sci_oem_params *oem, u8 version)
1688{
1689 int i;
1690
1691 for (i = 0; i < SCI_MAX_PORTS; i++)

--- 63 unchanged lines hidden (view full) ---

1755 }
1756 }
1757 }
1758 }
1759
1760 return 0;
1761}
1762
1838static enum sci_status sci_oem_parameters_set(struct isci_host *ihost)
1839{
1840 u32 state = ihost->sm.current_state_id;
1841 struct isci_pci_info *pci_info = to_pci_info(ihost->pdev);
1842
1843 if (state == SCIC_RESET ||
1844 state == SCIC_INITIALIZING ||
1845 state == SCIC_INITIALIZED) {
1846 u8 oem_version = pci_info->orom ? pci_info->orom->hdr.version :
1847 ISCI_ROM_VER_1_0;
1848
1849 if (sci_oem_parameters_validate(&ihost->oem_parameters,
1850 oem_version))
1851 return SCI_FAILURE_INVALID_PARAMETER_VALUE;
1852
1853 return SCI_SUCCESS;
1854 }
1855
1856 return SCI_FAILURE_INVALID_STATE;
1857}
1858
1859static u8 max_spin_up(struct isci_host *ihost)
1860{
1861 if (ihost->user_parameters.max_concurr_spinup)
1862 return min_t(u8, ihost->user_parameters.max_concurr_spinup,
1863 MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT);
1864 else
1865 return min_t(u8, ihost->oem_parameters.controller.max_concurr_spin_up,
1866 MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT);

--- 500 unchanged lines hidden (view full) ---

2367 state = SCIC_INITIALIZED;
2368 else
2369 state = SCIC_FAILED;
2370 sci_change_state(sm, state);
2371
2372 return result;
2373}
2374
1763static u8 max_spin_up(struct isci_host *ihost)
1764{
1765 if (ihost->user_parameters.max_concurr_spinup)
1766 return min_t(u8, ihost->user_parameters.max_concurr_spinup,
1767 MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT);
1768 else
1769 return min_t(u8, ihost->oem_parameters.controller.max_concurr_spin_up,
1770 MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT);

--- 500 unchanged lines hidden (view full) ---

2271 state = SCIC_INITIALIZED;
2272 else
2273 state = SCIC_FAILED;
2274 sci_change_state(sm, state);
2275
2276 return result;
2277}
2278
2375static enum sci_status sci_user_parameters_set(struct isci_host *ihost,
2376 struct sci_user_parameters *sci_parms)
2279static int sci_controller_dma_alloc(struct isci_host *ihost)
2377{
2280{
2378 u32 state = ihost->sm.current_state_id;
2281 struct device *dev = &ihost->pdev->dev;
2282 size_t size;
2283 int i;
2379
2284
2380 if (state == SCIC_RESET ||
2381 state == SCIC_INITIALIZING ||
2382 state == SCIC_INITIALIZED) {
2383 u16 index;
2285 /* detect re-initialization */
2286 if (ihost->completion_queue)
2287 return 0;
2384
2288
2385 /*
2386 * Validate the user parameters. If they are not legal, then
2387 * return a failure.
2388 */
2389 for (index = 0; index < SCI_MAX_PHYS; index++) {
2390 struct sci_phy_user_params *user_phy;
2289 size = SCU_MAX_COMPLETION_QUEUE_ENTRIES * sizeof(u32);
2290 ihost->completion_queue = dmam_alloc_coherent(dev, size, &ihost->cq_dma,
2291 GFP_KERNEL);
2292 if (!ihost->completion_queue)
2293 return -ENOMEM;
2391
2294
2392 user_phy = &sci_parms->phys[index];
2295 size = ihost->remote_node_entries * sizeof(union scu_remote_node_context);
2296 ihost->remote_node_context_table = dmam_alloc_coherent(dev, size, &ihost->rnc_dma,
2297 GFP_KERNEL);
2393
2298
2394 if (!((user_phy->max_speed_generation <=
2395 SCIC_SDS_PARM_MAX_SPEED) &&
2396 (user_phy->max_speed_generation >
2397 SCIC_SDS_PARM_NO_SPEED)))
2398 return SCI_FAILURE_INVALID_PARAMETER_VALUE;
2299 if (!ihost->remote_node_context_table)
2300 return -ENOMEM;
2399
2301
2400 if (user_phy->in_connection_align_insertion_frequency <
2401 3)
2402 return SCI_FAILURE_INVALID_PARAMETER_VALUE;
2302 size = ihost->task_context_entries * sizeof(struct scu_task_context),
2303 ihost->task_context_table = dmam_alloc_coherent(dev, size, &ihost->tc_dma,
2304 GFP_KERNEL);
2305 if (!ihost->task_context_table)
2306 return -ENOMEM;
2403
2307
2404 if ((user_phy->in_connection_align_insertion_frequency <
2405 3) ||
2406 (user_phy->align_insertion_frequency == 0) ||
2407 (user_phy->
2408 notify_enable_spin_up_insertion_frequency ==
2409 0))
2410 return SCI_FAILURE_INVALID_PARAMETER_VALUE;
2411 }
2308 size = SCI_UFI_TOTAL_SIZE;
2309 ihost->ufi_buf = dmam_alloc_coherent(dev, size, &ihost->ufi_dma, GFP_KERNEL);
2310 if (!ihost->ufi_buf)
2311 return -ENOMEM;
2412
2312
2413 if ((sci_parms->stp_inactivity_timeout == 0) ||
2414 (sci_parms->ssp_inactivity_timeout == 0) ||
2415 (sci_parms->stp_max_occupancy_timeout == 0) ||
2416 (sci_parms->ssp_max_occupancy_timeout == 0) ||
2417 (sci_parms->no_outbound_task_timeout == 0))
2418 return SCI_FAILURE_INVALID_PARAMETER_VALUE;
2313 for (i = 0; i < SCI_MAX_IO_REQUESTS; i++) {
2314 struct isci_request *ireq;
2315 dma_addr_t dma;
2419
2316
2420 memcpy(&ihost->user_parameters, sci_parms, sizeof(*sci_parms));
2317 ireq = dmam_alloc_coherent(dev, sizeof(*ireq), &dma, GFP_KERNEL);
2318 if (!ireq)
2319 return -ENOMEM;
2421
2320
2422 return SCI_SUCCESS;
2321 ireq->tc = &ihost->task_context_table[i];
2322 ireq->owning_controller = ihost;
2323 spin_lock_init(&ireq->state_lock);
2324 ireq->request_daddr = dma;
2325 ireq->isci_host = ihost;
2326 ihost->reqs[i] = ireq;
2423 }
2424
2327 }
2328
2425 return SCI_FAILURE_INVALID_STATE;
2329 return 0;
2426}
2427
2428static int sci_controller_mem_init(struct isci_host *ihost)
2429{
2330}
2331
2332static int sci_controller_mem_init(struct isci_host *ihost)
2333{
2430 struct device *dev = &ihost->pdev->dev;
2431 dma_addr_t dma;
2432 size_t size;
2433 int err;
2334 int err = sci_controller_dma_alloc(ihost);
2434
2335
2435 size = SCU_MAX_COMPLETION_QUEUE_ENTRIES * sizeof(u32);
2436 ihost->completion_queue = dmam_alloc_coherent(dev, size, &dma, GFP_KERNEL);
2437 if (!ihost->completion_queue)
2438 return -ENOMEM;
2336 if (err)
2337 return err;
2439
2338
2440 writel(lower_32_bits(dma), &ihost->smu_registers->completion_queue_lower);
2441 writel(upper_32_bits(dma), &ihost->smu_registers->completion_queue_upper);
2339 writel(lower_32_bits(ihost->cq_dma), &ihost->smu_registers->completion_queue_lower);
2340 writel(upper_32_bits(ihost->cq_dma), &ihost->smu_registers->completion_queue_upper);
2442
2341
2443 size = ihost->remote_node_entries * sizeof(union scu_remote_node_context);
2444 ihost->remote_node_context_table = dmam_alloc_coherent(dev, size, &dma,
2445 GFP_KERNEL);
2446 if (!ihost->remote_node_context_table)
2447 return -ENOMEM;
2342 writel(lower_32_bits(ihost->rnc_dma), &ihost->smu_registers->remote_node_context_lower);
2343 writel(upper_32_bits(ihost->rnc_dma), &ihost->smu_registers->remote_node_context_upper);
2448
2344
2449 writel(lower_32_bits(dma), &ihost->smu_registers->remote_node_context_lower);
2450 writel(upper_32_bits(dma), &ihost->smu_registers->remote_node_context_upper);
2345 writel(lower_32_bits(ihost->tc_dma), &ihost->smu_registers->host_task_table_lower);
2346 writel(upper_32_bits(ihost->tc_dma), &ihost->smu_registers->host_task_table_upper);
2451
2347
2452 size = ihost->task_context_entries * sizeof(struct scu_task_context),
2453 ihost->task_context_table = dmam_alloc_coherent(dev, size, &dma, GFP_KERNEL);
2454 if (!ihost->task_context_table)
2455 return -ENOMEM;
2348 sci_unsolicited_frame_control_construct(ihost);
2456
2349
2457 ihost->task_context_dma = dma;
2458 writel(lower_32_bits(dma), &ihost->smu_registers->host_task_table_lower);
2459 writel(upper_32_bits(dma), &ihost->smu_registers->host_task_table_upper);
2460
2461 err = sci_unsolicited_frame_control_construct(ihost);
2462 if (err)
2463 return err;
2464
2465 /*
2466 * Inform the silicon as to the location of the UF headers and
2467 * address table.
2468 */
2469 writel(lower_32_bits(ihost->uf_control.headers.physical_address),
2470 &ihost->scu_registers->sdma.uf_header_base_address_lower);
2471 writel(upper_32_bits(ihost->uf_control.headers.physical_address),
2472 &ihost->scu_registers->sdma.uf_header_base_address_upper);
2473
2474 writel(lower_32_bits(ihost->uf_control.address_table.physical_address),
2475 &ihost->scu_registers->sdma.uf_address_table_lower);
2476 writel(upper_32_bits(ihost->uf_control.address_table.physical_address),
2477 &ihost->scu_registers->sdma.uf_address_table_upper);
2478
2479 return 0;
2480}
2481
2350 /*
2351 * Inform the silicon as to the location of the UF headers and
2352 * address table.
2353 */
2354 writel(lower_32_bits(ihost->uf_control.headers.physical_address),
2355 &ihost->scu_registers->sdma.uf_header_base_address_lower);
2356 writel(upper_32_bits(ihost->uf_control.headers.physical_address),
2357 &ihost->scu_registers->sdma.uf_header_base_address_upper);
2358
2359 writel(lower_32_bits(ihost->uf_control.address_table.physical_address),
2360 &ihost->scu_registers->sdma.uf_address_table_lower);
2361 writel(upper_32_bits(ihost->uf_control.address_table.physical_address),
2362 &ihost->scu_registers->sdma.uf_address_table_upper);
2363
2364 return 0;
2365}
2366
2367/**
2368 * isci_host_init - (re-)initialize hardware and internal (private) state
2369 * @ihost: host to init
2370 *
2371 * Any public facing objects (like asd_sas_port, and asd_sas_phys), or
2372 * one-time initialization objects like locks and waitqueues, are
2373 * not touched (they are initialized in isci_host_alloc)
2374 */
2482int isci_host_init(struct isci_host *ihost)
2483{
2375int isci_host_init(struct isci_host *ihost)
2376{
2484 int err = 0, i;
2377 int i, err;
2485 enum sci_status status;
2378 enum sci_status status;
2486 struct sci_user_parameters sci_user_params;
2487 struct isci_pci_info *pci_info = to_pci_info(ihost->pdev);
2488
2379
2489 spin_lock_init(&ihost->scic_lock);
2490 init_waitqueue_head(&ihost->eventq);
2491
2492 status = sci_controller_construct(ihost, scu_base(ihost),
2493 smu_base(ihost));
2494
2380 status = sci_controller_construct(ihost, scu_base(ihost), smu_base(ihost));
2495 if (status != SCI_SUCCESS) {
2496 dev_err(&ihost->pdev->dev,
2497 "%s: sci_controller_construct failed - status = %x\n",
2498 __func__,
2499 status);
2500 return -ENODEV;
2501 }
2502
2381 if (status != SCI_SUCCESS) {
2382 dev_err(&ihost->pdev->dev,
2383 "%s: sci_controller_construct failed - status = %x\n",
2384 __func__,
2385 status);
2386 return -ENODEV;
2387 }
2388
2503 ihost->sas_ha.dev = &ihost->pdev->dev;
2504 ihost->sas_ha.lldd_ha = ihost;
2505
2506 /*
2507 * grab initial values stored in the controller object for OEM and USER
2508 * parameters
2509 */
2510 isci_user_parameters_get(&sci_user_params);
2511 status = sci_user_parameters_set(ihost, &sci_user_params);
2512 if (status != SCI_SUCCESS) {
2513 dev_warn(&ihost->pdev->dev,
2514 "%s: sci_user_parameters_set failed\n",
2515 __func__);
2516 return -ENODEV;
2517 }
2518
2519 /* grab any OEM parameters specified in orom */
2520 if (pci_info->orom) {
2521 status = isci_parse_oem_parameters(&ihost->oem_parameters,
2522 pci_info->orom,
2523 ihost->id);
2524 if (status != SCI_SUCCESS) {
2525 dev_warn(&ihost->pdev->dev,
2526 "parsing firmware oem parameters failed\n");
2527 return -EINVAL;
2528 }
2529 }
2530
2531 status = sci_oem_parameters_set(ihost);
2532 if (status != SCI_SUCCESS) {
2533 dev_warn(&ihost->pdev->dev,
2534 "%s: sci_oem_parameters_set failed\n",
2535 __func__);
2536 return -ENODEV;
2537 }
2538
2539 tasklet_init(&ihost->completion_tasklet,
2540 isci_host_completion_routine, (unsigned long)ihost);
2541
2542 INIT_LIST_HEAD(&ihost->requests_to_complete);
2543 INIT_LIST_HEAD(&ihost->requests_to_errorback);
2544
2545 spin_lock_irq(&ihost->scic_lock);
2546 status = sci_controller_initialize(ihost);
2547 spin_unlock_irq(&ihost->scic_lock);
2548 if (status != SCI_SUCCESS) {
2549 dev_warn(&ihost->pdev->dev,
2550 "%s: sci_controller_initialize failed -"
2551 " status = 0x%x\n",
2552 __func__, status);
2553 return -ENODEV;
2554 }
2555
2556 err = sci_controller_mem_init(ihost);
2557 if (err)
2558 return err;
2559
2389 spin_lock_irq(&ihost->scic_lock);
2390 status = sci_controller_initialize(ihost);
2391 spin_unlock_irq(&ihost->scic_lock);
2392 if (status != SCI_SUCCESS) {
2393 dev_warn(&ihost->pdev->dev,
2394 "%s: sci_controller_initialize failed -"
2395 " status = 0x%x\n",
2396 __func__, status);
2397 return -ENODEV;
2398 }
2399
2400 err = sci_controller_mem_init(ihost);
2401 if (err)
2402 return err;
2403
2560 for (i = 0; i < SCI_MAX_PORTS; i++) {
2561 struct isci_port *iport = &ihost->ports[i];
2562
2563 INIT_LIST_HEAD(&iport->remote_dev_list);
2564 iport->isci_host = ihost;
2565 }
2566
2567 for (i = 0; i < SCI_MAX_PHYS; i++)
2568 isci_phy_init(&ihost->phys[i], ihost, i);
2569
2570 /* enable sgpio */
2571 writel(1, &ihost->scu_registers->peg0.sgpio.interface_control);
2572 for (i = 0; i < isci_gpio_count(ihost); i++)
2573 writel(SGPIO_HW_CONTROL, &ihost->scu_registers->peg0.sgpio.output_data_select[i]);
2574 writel(0, &ihost->scu_registers->peg0.sgpio.vendor_specific_code);
2575
2404 /* enable sgpio */
2405 writel(1, &ihost->scu_registers->peg0.sgpio.interface_control);
2406 for (i = 0; i < isci_gpio_count(ihost); i++)
2407 writel(SGPIO_HW_CONTROL, &ihost->scu_registers->peg0.sgpio.output_data_select[i]);
2408 writel(0, &ihost->scu_registers->peg0.sgpio.vendor_specific_code);
2409
2576 for (i = 0; i < SCI_MAX_REMOTE_DEVICES; i++) {
2577 struct isci_remote_device *idev = &ihost->devices[i];
2578
2579 INIT_LIST_HEAD(&idev->reqs_in_process);
2580 INIT_LIST_HEAD(&idev->node);
2581 }
2582
2583 for (i = 0; i < SCI_MAX_IO_REQUESTS; i++) {
2584 struct isci_request *ireq;
2585 dma_addr_t dma;
2586
2587 ireq = dmam_alloc_coherent(&ihost->pdev->dev,
2588 sizeof(struct isci_request), &dma,
2589 GFP_KERNEL);
2590 if (!ireq)
2591 return -ENOMEM;
2592
2593 ireq->tc = &ihost->task_context_table[i];
2594 ireq->owning_controller = ihost;
2595 spin_lock_init(&ireq->state_lock);
2596 ireq->request_daddr = dma;
2597 ireq->isci_host = ihost;
2598 ihost->reqs[i] = ireq;
2599 }
2600
2601 return 0;
2602}
2603
2604void sci_controller_link_up(struct isci_host *ihost, struct isci_port *iport,
2605 struct isci_phy *iphy)
2606{
2607 switch (ihost->sm.current_state_id) {
2608 case SCIC_STARTING:

--- 418 unchanged lines hidden ---
2410 return 0;
2411}
2412
2413void sci_controller_link_up(struct isci_host *ihost, struct isci_port *iport,
2414 struct isci_phy *iphy)
2415{
2416 switch (ihost->sm.current_state_id) {
2417 case SCIC_STARTING:

--- 418 unchanged lines hidden ---