Deleted Added
full compact
if_msk.c (165138) if_msk.c (165611)
1/******************************************************************************
2 *
3 * Name : sky2.c
4 * Project: Gigabit Ethernet Driver for FreeBSD 5.x/6.x
5 * Version: $Revision: 1.23 $
6 * Date : $Date: 2005/12/22 09:04:11 $
7 * Purpose: Main driver source file
8 *

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

94
95/*
96 * Device driver for the Marvell Yukon II Ethernet controller.
97 * Due to lack of documentation, this driver is based on the code from
98 * sk(4) and Marvell's myk(4) driver for FreeBSD 5.x.
99 */
100
101#include <sys/cdefs.h>
1/******************************************************************************
2 *
3 * Name : sky2.c
4 * Project: Gigabit Ethernet Driver for FreeBSD 5.x/6.x
5 * Version: $Revision: 1.23 $
6 * Date : $Date: 2005/12/22 09:04:11 $
7 * Purpose: Main driver source file
8 *

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

94
95/*
96 * Device driver for the Marvell Yukon II Ethernet controller.
97 * Due to lack of documentation, this driver is based on the code from
98 * sk(4) and Marvell's myk(4) driver for FreeBSD 5.x.
99 */
100
101#include <sys/cdefs.h>
102__FBSDID("$FreeBSD: head/sys/dev/msk/if_msk.c 165138 2006-12-13 02:30:11Z yongari $");
102__FBSDID("$FreeBSD: head/sys/dev/msk/if_msk.c 165611 2006-12-29 03:33:33Z yongari $");
103
104#include <sys/param.h>
105#include <sys/systm.h>
106#include <sys/bus.h>
107#include <sys/endian.h>
108#include <sys/mbuf.h>
109#include <sys/malloc.h>
110#include <sys/kernel.h>

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

334static devclass_t msk_devclass;
335
336DRIVER_MODULE(mskc, pci, mskc_driver, mskc_devclass, 0, 0);
337DRIVER_MODULE(msk, mskc, msk_driver, msk_devclass, 0, 0);
338DRIVER_MODULE(miibus, msk, miibus_driver, miibus_devclass, 0, 0);
339
340static struct resource_spec msk_res_spec_io[] = {
341 { SYS_RES_IOPORT, PCIR_BAR(1), RF_ACTIVE },
103
104#include <sys/param.h>
105#include <sys/systm.h>
106#include <sys/bus.h>
107#include <sys/endian.h>
108#include <sys/mbuf.h>
109#include <sys/malloc.h>
110#include <sys/kernel.h>

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

334static devclass_t msk_devclass;
335
336DRIVER_MODULE(mskc, pci, mskc_driver, mskc_devclass, 0, 0);
337DRIVER_MODULE(msk, mskc, msk_driver, msk_devclass, 0, 0);
338DRIVER_MODULE(miibus, msk, miibus_driver, miibus_devclass, 0, 0);
339
340static struct resource_spec msk_res_spec_io[] = {
341 { SYS_RES_IOPORT, PCIR_BAR(1), RF_ACTIVE },
342 { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE },
343 { -1, 0, 0 }
344};
345
346static struct resource_spec msk_res_spec_mem[] = {
347 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
342 { -1, 0, 0 }
343};
344
345static struct resource_spec msk_res_spec_mem[] = {
346 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
347 { -1, 0, 0 }
348};
349
350static struct resource_spec msk_irq_spec_legacy[] = {
348 { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE },
349 { -1, 0, 0 }
350};
351
351 { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE },
352 { -1, 0, 0 }
353};
354
355static struct resource_spec msk_irq_spec_msi[] = {
356 { SYS_RES_IRQ, 1, RF_ACTIVE },
357 { SYS_RES_IRQ, 2, RF_ACTIVE },
358 { -1, 0, 0 }
359};
360
352static int
353msk_miibus_readreg(device_t dev, int phy, int reg)
354{
355 struct msk_if_softc *sc_if;
356
357 sc_if = device_get_softc(dev);
358
359 return (msk_phy_readreg(sc_if, phy, reg));

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

1541 mtx_init(&sc->msk_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
1542 MTX_DEF);
1543
1544 /*
1545 * Map control/status registers.
1546 */
1547 pci_enable_busmaster(dev);
1548
361static int
362msk_miibus_readreg(device_t dev, int phy, int reg)
363{
364 struct msk_if_softc *sc_if;
365
366 sc_if = device_get_softc(dev);
367
368 return (msk_phy_readreg(sc_if, phy, reg));

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

1550 mtx_init(&sc->msk_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
1551 MTX_DEF);
1552
1553 /*
1554 * Map control/status registers.
1555 */
1556 pci_enable_busmaster(dev);
1557
1549 /* Allocate resources */
1550 sc->msk_msi = 0;
1551 msic = pci_msi_count(dev);
1552 if (bootverbose)
1553 device_printf(dev, "MSI count : %d\n", msic);
1554 /*
1555 * Due to a unknown reason Yukon II reports it can handle two
1556 * messages even if it can handle just one message. Forcing
1557 * to allocate 1 message seems to work but reloading kernel
1558 * module after unloading the driver fails. Only use MSI when
1559 * it reports 1 message until we have better understanding
1560 * for the hardware.
1561 */
1562 if (msic == 1 && msi_disable == 0 && pci_alloc_msi(dev, &msic) == 0) {
1563 sc->msk_msi = 1;
1564 /* Set rid to 1 for SYS_RES_IRQ to use MSI. */
1565 msk_res_spec_io[1].rid = 1;
1566 msk_res_spec_mem[1].rid = 1;
1567 }
1558 /* Allocate I/O resource */
1568#ifdef MSK_USEIOSPACE
1569 sc->msk_res_spec = msk_res_spec_io;
1570#else
1571 sc->msk_res_spec = msk_res_spec_mem;
1572#endif
1573 error = bus_alloc_resources(dev, sc->msk_res_spec, sc->msk_res);
1574 if (error) {
1575 if (sc->msk_res_spec == msk_res_spec_mem)

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

1705 HWF_WA_DEV_4115;
1706 }
1707 break;
1708 default:
1709 sc->msk_clock = 156; /* 156 Mhz */
1710 sc->msk_hw_feature = 0;
1711 }
1712
1559#ifdef MSK_USEIOSPACE
1560 sc->msk_res_spec = msk_res_spec_io;
1561#else
1562 sc->msk_res_spec = msk_res_spec_mem;
1563#endif
1564 error = bus_alloc_resources(dev, sc->msk_res_spec, sc->msk_res);
1565 if (error) {
1566 if (sc->msk_res_spec == msk_res_spec_mem)

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

1696 HWF_WA_DEV_4115;
1697 }
1698 break;
1699 default:
1700 sc->msk_clock = 156; /* 156 Mhz */
1701 sc->msk_hw_feature = 0;
1702 }
1703
1704 /* Allocate IRQ resources. */
1705 msic = pci_msi_count(dev);
1706 if (bootverbose)
1707 device_printf(dev, "MSI count : %d\n", msic);
1708 /*
1709 * The Yukon II reports it can handle two messages, one for each
1710 * possible port. We go ahead and allocate two messages and only
1711 * setup a handler for both if we have a dual port card.
1712 *
1713 * XXX: I haven't untangled the interrupt handler to handle dual
1714 * port cards with separate MSI messages, so for now I disable MSI
1715 * on dual port cards.
1716 */
1717 if (msic == 2 && msi_disable == 0 && sc->msk_num_port == 1 &&
1718 pci_alloc_msi(dev, &msic) == 0) {
1719 if (msic == 2) {
1720 sc->msk_msi = 1;
1721 sc->msk_irq_spec = msk_irq_spec_msi;
1722 } else {
1723 pci_release_msi(dev);
1724 sc->msk_irq_spec = msk_irq_spec_legacy;
1725 }
1726 }
1727
1728 error = bus_alloc_resources(dev, sc->msk_irq_spec, sc->msk_irq);
1729 if (error) {
1730 device_printf(dev, "couldn't allocate IRQ resources\n");
1731 goto fail;
1732 }
1733
1713 if ((error = msk_status_dma_alloc(sc)) != 0)
1714 goto fail;
1715
1716 /* Set base interrupt mask. */
1717 sc->msk_intrmask = Y2_IS_HW_ERR | Y2_IS_STAT_BMU;
1718 sc->msk_intrhwemask = Y2_IS_TIST_OV | Y2_IS_MST_ERR |
1719 Y2_IS_IRQ_STAT | Y2_IS_PCI_EXP | Y2_IS_PCI_NEXP;
1720

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

1765 }
1766
1767 TASK_INIT(&sc->msk_int_task, 0, msk_int_task, sc);
1768 sc->msk_tq = taskqueue_create_fast("msk_taskq", M_WAITOK,
1769 taskqueue_thread_enqueue, &sc->msk_tq);
1770 taskqueue_start_threads(&sc->msk_tq, 1, PI_NET, "%s taskq",
1771 device_get_nameunit(sc->msk_dev));
1772 /* Hook interrupt last to avoid having to lock softc. */
1734 if ((error = msk_status_dma_alloc(sc)) != 0)
1735 goto fail;
1736
1737 /* Set base interrupt mask. */
1738 sc->msk_intrmask = Y2_IS_HW_ERR | Y2_IS_STAT_BMU;
1739 sc->msk_intrhwemask = Y2_IS_TIST_OV | Y2_IS_MST_ERR |
1740 Y2_IS_IRQ_STAT | Y2_IS_PCI_EXP | Y2_IS_PCI_NEXP;
1741

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

1786 }
1787
1788 TASK_INIT(&sc->msk_int_task, 0, msk_int_task, sc);
1789 sc->msk_tq = taskqueue_create_fast("msk_taskq", M_WAITOK,
1790 taskqueue_thread_enqueue, &sc->msk_tq);
1791 taskqueue_start_threads(&sc->msk_tq, 1, PI_NET, "%s taskq",
1792 device_get_nameunit(sc->msk_dev));
1793 /* Hook interrupt last to avoid having to lock softc. */
1773 error = bus_setup_intr(dev, sc->msk_res[1], INTR_TYPE_NET |
1774 INTR_MPSAFE | INTR_FAST, msk_intr, sc, &sc->msk_intrhand);
1794 error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET |
1795 INTR_MPSAFE | INTR_FAST, msk_intr, sc, &sc->msk_intrhand[0]);
1775
1776 if (error != 0) {
1777 device_printf(dev, "couldn't set up interrupt handler\n");
1778 taskqueue_free(sc->msk_tq);
1779 sc->msk_tq = NULL;
1780 goto fail;
1781 }
1782fail:

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

1879
1880 msk_status_dma_free(sc);
1881
1882 if (sc->msk_tq != NULL) {
1883 taskqueue_drain(sc->msk_tq, &sc->msk_int_task);
1884 taskqueue_free(sc->msk_tq);
1885 sc->msk_tq = NULL;
1886 }
1796
1797 if (error != 0) {
1798 device_printf(dev, "couldn't set up interrupt handler\n");
1799 taskqueue_free(sc->msk_tq);
1800 sc->msk_tq = NULL;
1801 goto fail;
1802 }
1803fail:

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

1900
1901 msk_status_dma_free(sc);
1902
1903 if (sc->msk_tq != NULL) {
1904 taskqueue_drain(sc->msk_tq, &sc->msk_int_task);
1905 taskqueue_free(sc->msk_tq);
1906 sc->msk_tq = NULL;
1907 }
1887 if (sc->msk_intrhand) {
1888 bus_teardown_intr(dev, sc->msk_res[1], sc->msk_intrhand);
1889 sc->msk_intrhand = NULL;
1908 if (sc->msk_intrhand[0]) {
1909 bus_teardown_intr(dev, sc->msk_irq[0], sc->msk_intrhand[0]);
1910 sc->msk_intrhand[0] = NULL;
1890 }
1911 }
1912 if (sc->msk_intrhand[1]) {
1913 bus_teardown_intr(dev, sc->msk_irq[0], sc->msk_intrhand[0]);
1914 sc->msk_intrhand[1] = NULL;
1915 }
1916 bus_release_resources(dev, sc->msk_irq_spec, sc->msk_irq);
1891 if (sc->msk_msi)
1892 pci_release_msi(dev);
1893 bus_release_resources(dev, sc->msk_res_spec, sc->msk_res);
1894 mtx_destroy(&sc->msk_mtx);
1895
1896 return (0);
1897}
1898

--- 2150 unchanged lines hidden ---
1917 if (sc->msk_msi)
1918 pci_release_msi(dev);
1919 bus_release_resources(dev, sc->msk_res_spec, sc->msk_res);
1920 mtx_destroy(&sc->msk_mtx);
1921
1922 return (0);
1923}
1924

--- 2150 unchanged lines hidden ---