diff options
Diffstat (limited to 'drivers/net/wireless/p54/p54pci.c')
| -rw-r--r-- | drivers/net/wireless/p54/p54pci.c | 132 |
1 files changed, 66 insertions, 66 deletions
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index 1c2a02a741af..88b3cad8b65e 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
| @@ -346,68 +346,6 @@ static void p54p_tx(struct ieee80211_hw *dev, struct p54_control_hdr *data, | |||
| 346 | printk(KERN_INFO "%s: tx overflow.\n", wiphy_name(dev->wiphy)); | 346 | printk(KERN_INFO "%s: tx overflow.\n", wiphy_name(dev->wiphy)); |
| 347 | } | 347 | } |
| 348 | 348 | ||
| 349 | static int p54p_open(struct ieee80211_hw *dev) | ||
| 350 | { | ||
| 351 | struct p54p_priv *priv = dev->priv; | ||
| 352 | int err; | ||
| 353 | |||
| 354 | init_completion(&priv->boot_comp); | ||
| 355 | err = request_irq(priv->pdev->irq, &p54p_interrupt, | ||
| 356 | IRQF_SHARED, "p54pci", dev); | ||
| 357 | if (err) { | ||
| 358 | printk(KERN_ERR "%s: failed to register IRQ handler\n", | ||
| 359 | wiphy_name(dev->wiphy)); | ||
| 360 | return err; | ||
| 361 | } | ||
| 362 | |||
| 363 | memset(priv->ring_control, 0, sizeof(*priv->ring_control)); | ||
| 364 | err = p54p_upload_firmware(dev); | ||
| 365 | if (err) { | ||
| 366 | free_irq(priv->pdev->irq, dev); | ||
| 367 | return err; | ||
| 368 | } | ||
| 369 | priv->rx_idx_data = priv->tx_idx_data = 0; | ||
| 370 | priv->rx_idx_mgmt = priv->tx_idx_mgmt = 0; | ||
| 371 | |||
| 372 | p54p_refill_rx_ring(dev, 0, priv->ring_control->rx_data, | ||
| 373 | ARRAY_SIZE(priv->ring_control->rx_data), priv->rx_buf_data); | ||
| 374 | |||
| 375 | p54p_refill_rx_ring(dev, 2, priv->ring_control->rx_mgmt, | ||
| 376 | ARRAY_SIZE(priv->ring_control->rx_mgmt), priv->rx_buf_mgmt); | ||
| 377 | |||
| 378 | P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma)); | ||
| 379 | P54P_READ(ring_control_base); | ||
| 380 | wmb(); | ||
| 381 | udelay(10); | ||
| 382 | |||
| 383 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT)); | ||
| 384 | P54P_READ(int_enable); | ||
| 385 | wmb(); | ||
| 386 | udelay(10); | ||
| 387 | |||
| 388 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET)); | ||
| 389 | P54P_READ(dev_int); | ||
| 390 | |||
| 391 | if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) { | ||
| 392 | printk(KERN_ERR "%s: Cannot boot firmware!\n", | ||
| 393 | wiphy_name(dev->wiphy)); | ||
| 394 | free_irq(priv->pdev->irq, dev); | ||
| 395 | return -ETIMEDOUT; | ||
| 396 | } | ||
| 397 | |||
| 398 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE)); | ||
| 399 | P54P_READ(int_enable); | ||
| 400 | wmb(); | ||
| 401 | udelay(10); | ||
| 402 | |||
| 403 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE)); | ||
| 404 | P54P_READ(dev_int); | ||
| 405 | wmb(); | ||
| 406 | udelay(10); | ||
| 407 | |||
| 408 | return 0; | ||
| 409 | } | ||
| 410 | |||
| 411 | static void p54p_stop(struct ieee80211_hw *dev) | 349 | static void p54p_stop(struct ieee80211_hw *dev) |
| 412 | { | 350 | { |
| 413 | struct p54p_priv *priv = dev->priv; | 351 | struct p54p_priv *priv = dev->priv; |
| @@ -474,6 +412,68 @@ static void p54p_stop(struct ieee80211_hw *dev) | |||
| 474 | memset(ring_control, 0, sizeof(*ring_control)); | 412 | memset(ring_control, 0, sizeof(*ring_control)); |
| 475 | } | 413 | } |
| 476 | 414 | ||
| 415 | static int p54p_open(struct ieee80211_hw *dev) | ||
| 416 | { | ||
| 417 | struct p54p_priv *priv = dev->priv; | ||
| 418 | int err; | ||
| 419 | |||
| 420 | init_completion(&priv->boot_comp); | ||
| 421 | err = request_irq(priv->pdev->irq, &p54p_interrupt, | ||
| 422 | IRQF_SHARED, "p54pci", dev); | ||
| 423 | if (err) { | ||
| 424 | printk(KERN_ERR "%s: failed to register IRQ handler\n", | ||
| 425 | wiphy_name(dev->wiphy)); | ||
| 426 | return err; | ||
| 427 | } | ||
| 428 | |||
| 429 | memset(priv->ring_control, 0, sizeof(*priv->ring_control)); | ||
| 430 | err = p54p_upload_firmware(dev); | ||
| 431 | if (err) { | ||
| 432 | free_irq(priv->pdev->irq, dev); | ||
| 433 | return err; | ||
| 434 | } | ||
| 435 | priv->rx_idx_data = priv->tx_idx_data = 0; | ||
| 436 | priv->rx_idx_mgmt = priv->tx_idx_mgmt = 0; | ||
| 437 | |||
| 438 | p54p_refill_rx_ring(dev, 0, priv->ring_control->rx_data, | ||
| 439 | ARRAY_SIZE(priv->ring_control->rx_data), priv->rx_buf_data); | ||
| 440 | |||
| 441 | p54p_refill_rx_ring(dev, 2, priv->ring_control->rx_mgmt, | ||
| 442 | ARRAY_SIZE(priv->ring_control->rx_mgmt), priv->rx_buf_mgmt); | ||
| 443 | |||
| 444 | P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma)); | ||
| 445 | P54P_READ(ring_control_base); | ||
| 446 | wmb(); | ||
| 447 | udelay(10); | ||
| 448 | |||
| 449 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT)); | ||
| 450 | P54P_READ(int_enable); | ||
| 451 | wmb(); | ||
| 452 | udelay(10); | ||
| 453 | |||
| 454 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET)); | ||
| 455 | P54P_READ(dev_int); | ||
| 456 | |||
| 457 | if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) { | ||
| 458 | printk(KERN_ERR "%s: Cannot boot firmware!\n", | ||
| 459 | wiphy_name(dev->wiphy)); | ||
| 460 | p54p_stop(dev); | ||
| 461 | return -ETIMEDOUT; | ||
| 462 | } | ||
| 463 | |||
| 464 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE)); | ||
| 465 | P54P_READ(int_enable); | ||
| 466 | wmb(); | ||
| 467 | udelay(10); | ||
| 468 | |||
| 469 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE)); | ||
| 470 | P54P_READ(dev_int); | ||
| 471 | wmb(); | ||
| 472 | udelay(10); | ||
| 473 | |||
| 474 | return 0; | ||
| 475 | } | ||
| 476 | |||
| 477 | static int __devinit p54p_probe(struct pci_dev *pdev, | 477 | static int __devinit p54p_probe(struct pci_dev *pdev, |
| 478 | const struct pci_device_id *id) | 478 | const struct pci_device_id *id) |
| 479 | { | 479 | { |
| @@ -556,11 +556,13 @@ static int __devinit p54p_probe(struct pci_dev *pdev, | |||
| 556 | spin_lock_init(&priv->lock); | 556 | spin_lock_init(&priv->lock); |
| 557 | tasklet_init(&priv->rx_tasklet, p54p_rx_tasklet, (unsigned long)dev); | 557 | tasklet_init(&priv->rx_tasklet, p54p_rx_tasklet, (unsigned long)dev); |
| 558 | 558 | ||
| 559 | p54p_open(dev); | 559 | err = p54p_open(dev); |
| 560 | if (err) | ||
| 561 | goto err_free_common; | ||
| 560 | err = p54_read_eeprom(dev); | 562 | err = p54_read_eeprom(dev); |
| 561 | p54p_stop(dev); | 563 | p54p_stop(dev); |
| 562 | if (err) | 564 | if (err) |
| 563 | goto err_free_desc; | 565 | goto err_free_common; |
| 564 | 566 | ||
| 565 | err = ieee80211_register_hw(dev); | 567 | err = ieee80211_register_hw(dev); |
| 566 | if (err) { | 568 | if (err) { |
| @@ -573,8 +575,6 @@ static int __devinit p54p_probe(struct pci_dev *pdev, | |||
| 573 | 575 | ||
| 574 | err_free_common: | 576 | err_free_common: |
| 575 | p54_free_common(dev); | 577 | p54_free_common(dev); |
| 576 | |||
| 577 | err_free_desc: | ||
| 578 | pci_free_consistent(pdev, sizeof(*priv->ring_control), | 578 | pci_free_consistent(pdev, sizeof(*priv->ring_control), |
| 579 | priv->ring_control, priv->ring_control_dma); | 579 | priv->ring_control, priv->ring_control_dma); |
| 580 | 580 | ||
