19a5557fdSlucy wang - Sun Microsystems - Beijing China /* 29a5557fdSlucy wang - Sun Microsystems - Beijing China * CDDL HEADER START 39a5557fdSlucy wang - Sun Microsystems - Beijing China * 49a5557fdSlucy wang - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the 59a5557fdSlucy wang - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License"). 69a5557fdSlucy wang - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License. 79a5557fdSlucy wang - Sun Microsystems - Beijing China * 89a5557fdSlucy wang - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 99a5557fdSlucy wang - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing. 109a5557fdSlucy wang - Sun Microsystems - Beijing China * See the License for the specific language governing permissions 119a5557fdSlucy wang - Sun Microsystems - Beijing China * and limitations under the License. 129a5557fdSlucy wang - Sun Microsystems - Beijing China * 139a5557fdSlucy wang - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each 149a5557fdSlucy wang - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 159a5557fdSlucy wang - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the 169a5557fdSlucy wang - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying 179a5557fdSlucy wang - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner] 189a5557fdSlucy wang - Sun Microsystems - Beijing China * 199a5557fdSlucy wang - Sun Microsystems - Beijing China * CDDL HEADER END 209a5557fdSlucy wang - Sun Microsystems - Beijing China */ 219a5557fdSlucy wang - Sun Microsystems - Beijing China /* 229a5557fdSlucy wang - Sun Microsystems - Beijing China * Copyright 2008 NetXen, Inc. All rights reserved. 239a5557fdSlucy wang - Sun Microsystems - Beijing China * Use is subject to license terms. 249a5557fdSlucy wang - Sun Microsystems - Beijing China */ 259a5557fdSlucy wang - Sun Microsystems - Beijing China /* 2693833965Sjing xiong ERI-SUN * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 279a5557fdSlucy wang - Sun Microsystems - Beijing China * Use is subject to license terms. 289a5557fdSlucy wang - Sun Microsystems - Beijing China */ 299a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/types.h> 309a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/conf.h> 319a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/debug.h> 329a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stropts.h> 339a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stream.h> 349a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strlog.h> 359a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kmem.h> 369a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stat.h> 379a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kstat.h> 389a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/vtrace.h> 399a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dlpi.h> 409a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strsun.h> 419a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ethernet.h> 429a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/modctl.h> 439a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/errno.h> 449a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dditypes.h> 459a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ddi.h> 469a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sunddi.h> 479a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sysmacros.h> 489a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/pci.h> 499a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ddi_intr.h> 509a5557fdSlucy wang - Sun Microsystems - Beijing China 519a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic.h" 529a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic_hw.h" 539a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_brdcfg.h" 549a5557fdSlucy wang - Sun Microsystems - Beijing China #include "nic_cmn.h" 559a5557fdSlucy wang - Sun Microsystems - Beijing China #include "nic_phan_reg.h" 569a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic_ioctl.h" 579a5557fdSlucy wang - Sun Microsystems - Beijing China #include "nx_hw_pci_regs.h" 589a5557fdSlucy wang - Sun Microsystems - Beijing China 599a5557fdSlucy wang - Sun Microsystems - Beijing China char ident[] = "Netxen nic driver v" UNM_NIC_VERSIONID; 609a5557fdSlucy wang - Sun Microsystems - Beijing China char unm_nic_driver_name[] = "ntxn"; 619a5557fdSlucy wang - Sun Microsystems - Beijing China int verbmsg = 0; 629a5557fdSlucy wang - Sun Microsystems - Beijing China 639a5557fdSlucy wang - Sun Microsystems - Beijing China static char txbcopythreshold_propname[] = "tx_bcopy_threshold"; 649a5557fdSlucy wang - Sun Microsystems - Beijing China static char rxbcopythreshold_propname[] = "rx_bcopy_threshold"; 659a5557fdSlucy wang - Sun Microsystems - Beijing China static char rxringsize_propname[] = "rx_ring_size"; 669a5557fdSlucy wang - Sun Microsystems - Beijing China static char jumborxringsize_propname[] = "jumbo_rx_ring_size"; 679a5557fdSlucy wang - Sun Microsystems - Beijing China static char txringsize_propname[] = "tx_ring_size"; 689a5557fdSlucy wang - Sun Microsystems - Beijing China static char defaultmtu_propname[] = "default_mtu"; 699a5557fdSlucy wang - Sun Microsystems - Beijing China static char dmesg_propname[] = "verbose_driver"; 709a5557fdSlucy wang - Sun Microsystems - Beijing China 719a5557fdSlucy wang - Sun Microsystems - Beijing China #define STRUCT_COPY(a, b) bcopy(&(b), &(a), sizeof (a)) 729a5557fdSlucy wang - Sun Microsystems - Beijing China 739a5557fdSlucy wang - Sun Microsystems - Beijing China extern int unm_register_mac(unm_adapter *adapter); 749a5557fdSlucy wang - Sun Microsystems - Beijing China extern void unm_fini_kstats(unm_adapter* adapter); 759a5557fdSlucy wang - Sun Microsystems - Beijing China extern void unm_nic_remove(unm_adapter *adapter); 769a5557fdSlucy wang - Sun Microsystems - Beijing China extern int unm_nic_suspend(unm_adapter *); 779a5557fdSlucy wang - Sun Microsystems - Beijing China extern uint_t unm_intr(caddr_t, caddr_t); 789a5557fdSlucy wang - Sun Microsystems - Beijing China 799a5557fdSlucy wang - Sun Microsystems - Beijing China /* Data access requirements. */ 809a5557fdSlucy wang - Sun Microsystems - Beijing China static struct ddi_device_acc_attr unm_dev_attr = { 819a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0, 829a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_STRUCTURE_LE_ACC, 839a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC 849a5557fdSlucy wang - Sun Microsystems - Beijing China }; 859a5557fdSlucy wang - Sun Microsystems - Beijing China 869a5557fdSlucy wang - Sun Microsystems - Beijing China static struct ddi_device_acc_attr unm_buf_attr = { 879a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0, 889a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_NEVERSWAP_ACC, 899a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC 909a5557fdSlucy wang - Sun Microsystems - Beijing China }; 919a5557fdSlucy wang - Sun Microsystems - Beijing China 929a5557fdSlucy wang - Sun Microsystems - Beijing China static ddi_dma_attr_t unm_dma_attr_desc = { 939a5557fdSlucy wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* dma_attr_version */ 949a5557fdSlucy wang - Sun Microsystems - Beijing China 0, /* dma_attr_addr_lo */ 959a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffffffffull, /* dma_attr_addr_hi */ 969a5557fdSlucy wang - Sun Microsystems - Beijing China 0x000fffffull, /* dma_attr_count_max */ 979a5557fdSlucy wang - Sun Microsystems - Beijing China 4096, /* dma_attr_align */ 989a5557fdSlucy wang - Sun Microsystems - Beijing China 0x000fffffull, /* dma_attr_burstsizes */ 999a5557fdSlucy wang - Sun Microsystems - Beijing China 4, /* dma_attr_minxfer */ 1009a5557fdSlucy wang - Sun Microsystems - Beijing China 0x003fffffull, /* dma_attr_maxxfer */ 1019a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffffffffull, /* dma_attr_seg */ 1029a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_sgllen */ 1039a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_granular */ 1049a5557fdSlucy wang - Sun Microsystems - Beijing China 0 /* dma_attr_flags */ 1059a5557fdSlucy wang - Sun Microsystems - Beijing China }; 1069a5557fdSlucy wang - Sun Microsystems - Beijing China 1079a5557fdSlucy wang - Sun Microsystems - Beijing China static ddi_dma_attr_t unm_dma_attr_rxbuf = { 1089a5557fdSlucy wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* dma_attr_version */ 1099a5557fdSlucy wang - Sun Microsystems - Beijing China 0, /* dma_attr_addr_lo */ 1109a5557fdSlucy wang - Sun Microsystems - Beijing China 0x7ffffffffULL, /* dma_attr_addr_hi */ 1119a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_count_max */ 1129a5557fdSlucy wang - Sun Microsystems - Beijing China 4096, /* dma_attr_align */ 1139a5557fdSlucy wang - Sun Microsystems - Beijing China 0xfff8ull, /* dma_attr_burstsizes */ 1149a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_minxfer */ 1159a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffffffffull, /* dma_attr_maxxfer */ 1169a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_seg */ 1179a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_sgllen */ 1189a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_granular */ 1199a5557fdSlucy wang - Sun Microsystems - Beijing China 0 /* dma_attr_flags */ 1209a5557fdSlucy wang - Sun Microsystems - Beijing China }; 1219a5557fdSlucy wang - Sun Microsystems - Beijing China 1229a5557fdSlucy wang - Sun Microsystems - Beijing China static ddi_dma_attr_t unm_dma_attr_cmddesc = { 1239a5557fdSlucy wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* dma_attr_version */ 1249a5557fdSlucy wang - Sun Microsystems - Beijing China 0, /* dma_attr_addr_lo */ 1259a5557fdSlucy wang - Sun Microsystems - Beijing China 0x7ffffffffULL, /* dma_attr_addr_hi */ 1269a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_count_max */ 1279a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_align */ 1289a5557fdSlucy wang - Sun Microsystems - Beijing China 0xfff8ull, /* dma_attr_burstsizes */ 1299a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_minxfer */ 1309a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffff0ull, /* dma_attr_maxxfer */ 1319a5557fdSlucy wang - Sun Microsystems - Beijing China 0xffffull, /* dma_attr_seg */ 1329a5557fdSlucy wang - Sun Microsystems - Beijing China 16, /* dma_attr_sgllen */ 1339a5557fdSlucy wang - Sun Microsystems - Beijing China 1, /* dma_attr_granular */ 1349a5557fdSlucy wang - Sun Microsystems - Beijing China 0 /* dma_attr_flags */ 1359a5557fdSlucy wang - Sun Microsystems - Beijing China }; 1369a5557fdSlucy wang - Sun Microsystems - Beijing China 1379a5557fdSlucy wang - Sun Microsystems - Beijing China static struct nx_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG; 1389a5557fdSlucy wang - Sun Microsystems - Beijing China 1399a5557fdSlucy wang - Sun Microsystems - Beijing China static int 1409a5557fdSlucy wang - Sun Microsystems - Beijing China check_hw_init(struct unm_adapter_s *adapter) 1419a5557fdSlucy wang - Sun Microsystems - Beijing China { 1429a5557fdSlucy wang - Sun Microsystems - Beijing China u32 val; 1439a5557fdSlucy wang - Sun Microsystems - Beijing China int ret = 0; 1449a5557fdSlucy wang - Sun Microsystems - Beijing China 1459a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, UNM_CAM_RAM(0x1fc), &val, 4); 1469a5557fdSlucy wang - Sun Microsystems - Beijing China if (val == 0x55555555) { 1479a5557fdSlucy wang - Sun Microsystems - Beijing China /* This is the first boot after power up */ 1489a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, UNM_ROMUSB_GLB_SW_RESET, 1499a5557fdSlucy wang - Sun Microsystems - Beijing China &val, 4); 1509a5557fdSlucy wang - Sun Microsystems - Beijing China if (val != 0x80000f) 1519a5557fdSlucy wang - Sun Microsystems - Beijing China ret = -1; 1529a5557fdSlucy wang - Sun Microsystems - Beijing China 1539a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { 1549a5557fdSlucy wang - Sun Microsystems - Beijing China /* Start P2 boot loader */ 1559a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_pci_write_normalize(adapter, 1569a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_CAM_RAM(0x1fc), UNM_BDINFO_MAGIC); 1579a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_pci_write_normalize(adapter, 1589a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_ROMUSB_GLB_PEGTUNE_DONE, 1); 1599a5557fdSlucy wang - Sun Microsystems - Beijing China } 1609a5557fdSlucy wang - Sun Microsystems - Beijing China } 1619a5557fdSlucy wang - Sun Microsystems - Beijing China return (ret); 1629a5557fdSlucy wang - Sun Microsystems - Beijing China } 1639a5557fdSlucy wang - Sun Microsystems - Beijing China 1649a5557fdSlucy wang - Sun Microsystems - Beijing China 1659a5557fdSlucy wang - Sun Microsystems - Beijing China static int 1669a5557fdSlucy wang - Sun Microsystems - Beijing China unm_get_flash_block(unm_adapter *adapter, int base, int size, uint32_t *buf) 1679a5557fdSlucy wang - Sun Microsystems - Beijing China { 1689a5557fdSlucy wang - Sun Microsystems - Beijing China int i, addr; 1699a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t *ptr32; 1709a5557fdSlucy wang - Sun Microsystems - Beijing China 1719a5557fdSlucy wang - Sun Microsystems - Beijing China addr = base; 1729a5557fdSlucy wang - Sun Microsystems - Beijing China ptr32 = buf; 1739a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < size / sizeof (uint32_t); i++) { 1749a5557fdSlucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, addr, (int *)ptr32) == -1) 1759a5557fdSlucy wang - Sun Microsystems - Beijing China return (-1); 1769a5557fdSlucy wang - Sun Microsystems - Beijing China ptr32++; 1779a5557fdSlucy wang - Sun Microsystems - Beijing China addr += sizeof (uint32_t); 1789a5557fdSlucy wang - Sun Microsystems - Beijing China } 1799a5557fdSlucy wang - Sun Microsystems - Beijing China if ((char *)buf + size > (char *)ptr32) { 1809a5557fdSlucy wang - Sun Microsystems - Beijing China int local; 1819a5557fdSlucy wang - Sun Microsystems - Beijing China 1829a5557fdSlucy wang - Sun Microsystems - Beijing China if (rom_fast_read(adapter, addr, &local) == -1) 1839a5557fdSlucy wang - Sun Microsystems - Beijing China return (-1); 1849a5557fdSlucy wang - Sun Microsystems - Beijing China (void) memcpy(ptr32, &local, 1859a5557fdSlucy wang - Sun Microsystems - Beijing China (uintptr_t)((char *)buf + size) - (uintptr_t)(char *)ptr32); 1869a5557fdSlucy wang - Sun Microsystems - Beijing China } 1879a5557fdSlucy wang - Sun Microsystems - Beijing China 1889a5557fdSlucy wang - Sun Microsystems - Beijing China return (0); 1899a5557fdSlucy wang - Sun Microsystems - Beijing China } 1909a5557fdSlucy wang - Sun Microsystems - Beijing China 1919a5557fdSlucy wang - Sun Microsystems - Beijing China 1929a5557fdSlucy wang - Sun Microsystems - Beijing China static int 1939a5557fdSlucy wang - Sun Microsystems - Beijing China get_flash_mac_addr(struct unm_adapter_s *adapter, u64 mac[]) 1949a5557fdSlucy wang - Sun Microsystems - Beijing China { 1959a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t *pmac = (uint32_t *)&mac[0]; 1969a5557fdSlucy wang - Sun Microsystems - Beijing China 1979a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { 1989a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t temp, crbaddr; 1999a5557fdSlucy wang - Sun Microsystems - Beijing China uint16_t *pmac16 = (uint16_t *)pmac; 2009a5557fdSlucy wang - Sun Microsystems - Beijing China 2019a5557fdSlucy wang - Sun Microsystems - Beijing China // FOR P3, read from CAM RAM 2029a5557fdSlucy wang - Sun Microsystems - Beijing China 2039a5557fdSlucy wang - Sun Microsystems - Beijing China int pci_func = adapter->ahw.pci_func; 2049a5557fdSlucy wang - Sun Microsystems - Beijing China pmac16 += (4 * pci_func); 2059a5557fdSlucy wang - Sun Microsystems - Beijing China crbaddr = CRB_MAC_BLOCK_START + (4 * ((pci_func/2) * 3)) + 2069a5557fdSlucy wang - Sun Microsystems - Beijing China (4 * (pci_func & 1)); 2079a5557fdSlucy wang - Sun Microsystems - Beijing China 2089a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, crbaddr, &temp, 4); 2099a5557fdSlucy wang - Sun Microsystems - Beijing China if (pci_func & 1) { 2109a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp >> 16); 2119a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, crbaddr+4, 2129a5557fdSlucy wang - Sun Microsystems - Beijing China &temp, 4); 2139a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp & 0xffff); 2149a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp >> 16); 2159a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16 = 0; 2169a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 2179a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp & 0xffff); 2189a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp >> 16); 2199a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, crbaddr+4, 2209a5557fdSlucy wang - Sun Microsystems - Beijing China &temp, 4); 2219a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16++ = (temp & 0xffff); 2229a5557fdSlucy wang - Sun Microsystems - Beijing China *pmac16 = 0; 2239a5557fdSlucy wang - Sun Microsystems - Beijing China } 2249a5557fdSlucy wang - Sun Microsystems - Beijing China return (0); 2259a5557fdSlucy wang - Sun Microsystems - Beijing China } 2269a5557fdSlucy wang - Sun Microsystems - Beijing China 2279a5557fdSlucy wang - Sun Microsystems - Beijing China 2289a5557fdSlucy wang - Sun Microsystems - Beijing China if (unm_get_flash_block(adapter, USER_START + 2299a5557fdSlucy wang - Sun Microsystems - Beijing China offsetof(unm_user_info_t, mac_addr), FLASH_NUM_PORTS * sizeof (U64), 2309a5557fdSlucy wang - Sun Microsystems - Beijing China pmac) == -1) 2319a5557fdSlucy wang - Sun Microsystems - Beijing China return (-1); 2329a5557fdSlucy wang - Sun Microsystems - Beijing China 2339a5557fdSlucy wang - Sun Microsystems - Beijing China if (*mac == ~0ULL) { 2349a5557fdSlucy wang - Sun Microsystems - Beijing China if (unm_get_flash_block(adapter, USER_START_OLD + 2359a5557fdSlucy wang - Sun Microsystems - Beijing China offsetof(unm_old_user_info_t, mac_addr), 2369a5557fdSlucy wang - Sun Microsystems - Beijing China FLASH_NUM_PORTS * sizeof (U64), pmac) == -1) 2379a5557fdSlucy wang - Sun Microsystems - Beijing China return (-1); 2389a5557fdSlucy wang - Sun Microsystems - Beijing China 2399a5557fdSlucy wang - Sun Microsystems - Beijing China if (*mac == ~0ULL) 2409a5557fdSlucy wang - Sun Microsystems - Beijing China return (-1); 2419a5557fdSlucy wang - Sun Microsystems - Beijing China } 2429a5557fdSlucy wang - Sun Microsystems - Beijing China 2439a5557fdSlucy wang - Sun Microsystems - Beijing China return (0); 2449a5557fdSlucy wang - Sun Microsystems - Beijing China } 2459a5557fdSlucy wang - Sun Microsystems - Beijing China 2469a5557fdSlucy wang - Sun Microsystems - Beijing China static int 2479a5557fdSlucy wang - Sun Microsystems - Beijing China unm_initialize_dummy_dma(unm_adapter *adapter) 2489a5557fdSlucy wang - Sun Microsystems - Beijing China { 2499a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t hi, lo, temp; 2509a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_dma_cookie_t cookie; 2519a5557fdSlucy wang - Sun Microsystems - Beijing China 2529a5557fdSlucy wang - Sun Microsystems - Beijing China if (unm_pci_alloc_consistent(adapter, UNM_HOST_DUMMY_DMA_SIZE, 2539a5557fdSlucy wang - Sun Microsystems - Beijing China (caddr_t *)&adapter->dummy_dma.addr, &cookie, 2549a5557fdSlucy wang - Sun Microsystems - Beijing China &adapter->dummy_dma.dma_handle, 2559a5557fdSlucy wang - Sun Microsystems - Beijing China &adapter->dummy_dma.acc_handle) != DDI_SUCCESS) { 2569a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Unable to alloc dummy dma buf\n", 2579a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 2589a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_ENOMEM); 2599a5557fdSlucy wang - Sun Microsystems - Beijing China } 2609a5557fdSlucy wang - Sun Microsystems - Beijing China 2619a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->dummy_dma.phys_addr = cookie.dmac_laddress; 2629a5557fdSlucy wang - Sun Microsystems - Beijing China 2639a5557fdSlucy wang - Sun Microsystems - Beijing China hi = (adapter->dummy_dma.phys_addr >> 32) & 0xffffffff; 2649a5557fdSlucy wang - Sun Microsystems - Beijing China lo = adapter->dummy_dma.phys_addr & 0xffffffff; 2659a5557fdSlucy wang - Sun Microsystems - Beijing China 2669a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_READ_LOCK(&adapter->adapter_lock); 2679a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_HOST_DUMMY_BUF_ADDR_HI, 2689a5557fdSlucy wang - Sun Microsystems - Beijing China &hi, 4); 2699a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_HOST_DUMMY_BUF_ADDR_LO, 2709a5557fdSlucy wang - Sun Microsystems - Beijing China &lo, 4); 2719a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { 2729a5557fdSlucy wang - Sun Microsystems - Beijing China temp = DUMMY_BUF_INIT; 2739a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_HOST_DUMMY_BUF, 2749a5557fdSlucy wang - Sun Microsystems - Beijing China &temp, 4); 2759a5557fdSlucy wang - Sun Microsystems - Beijing China } 2769a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_READ_UNLOCK(&adapter->adapter_lock); 2779a5557fdSlucy wang - Sun Microsystems - Beijing China 2789a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 2799a5557fdSlucy wang - Sun Microsystems - Beijing China } 2809a5557fdSlucy wang - Sun Microsystems - Beijing China 2819a5557fdSlucy wang - Sun Microsystems - Beijing China void 2829a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dummy_dma(unm_adapter *adapter) 2839a5557fdSlucy wang - Sun Microsystems - Beijing China { 2849a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->dummy_dma.addr) { 2859a5557fdSlucy wang - Sun Microsystems - Beijing China unm_pci_free_consistent(&adapter->dummy_dma.dma_handle, 2869a5557fdSlucy wang - Sun Microsystems - Beijing China &adapter->dummy_dma.acc_handle); 2879a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->dummy_dma.addr = NULL; 2889a5557fdSlucy wang - Sun Microsystems - Beijing China } 2899a5557fdSlucy wang - Sun Microsystems - Beijing China } 2909a5557fdSlucy wang - Sun Microsystems - Beijing China 2919a5557fdSlucy wang - Sun Microsystems - Beijing China static int 2929a5557fdSlucy wang - Sun Microsystems - Beijing China unm_pci_cfg_init(unm_adapter *adapter) 2939a5557fdSlucy wang - Sun Microsystems - Beijing China { 2949a5557fdSlucy wang - Sun Microsystems - Beijing China hardware_context *hwcontext; 2959a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_acc_handle_t pci_cfg_hdl; 2969a5557fdSlucy wang - Sun Microsystems - Beijing China int *reg_options; 2979a5557fdSlucy wang - Sun Microsystems - Beijing China dev_info_t *dip; 2989a5557fdSlucy wang - Sun Microsystems - Beijing China uint_t noptions; 2999a5557fdSlucy wang - Sun Microsystems - Beijing China int ret; 3009a5557fdSlucy wang - Sun Microsystems - Beijing China uint16_t vendor_id, pci_cmd_word; 3019a5557fdSlucy wang - Sun Microsystems - Beijing China uint8_t base_class, sub_class, prog_class; 3029a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t pexsizes; 3039a5557fdSlucy wang - Sun Microsystems - Beijing China struct nx_legacy_intr_set *legacy_intrp; 3049a5557fdSlucy wang - Sun Microsystems - Beijing China 3059a5557fdSlucy wang - Sun Microsystems - Beijing China hwcontext = &adapter->ahw; 3069a5557fdSlucy wang - Sun Microsystems - Beijing China pci_cfg_hdl = adapter->pci_cfg_handle; 3079a5557fdSlucy wang - Sun Microsystems - Beijing China dip = adapter->dip; 3089a5557fdSlucy wang - Sun Microsystems - Beijing China 3099a5557fdSlucy wang - Sun Microsystems - Beijing China vendor_id = pci_config_get16(pci_cfg_hdl, PCI_CONF_VENID); 3109a5557fdSlucy wang - Sun Microsystems - Beijing China 3119a5557fdSlucy wang - Sun Microsystems - Beijing China if (vendor_id != 0x4040) { 3129a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: vendor id %x not 0x4040\n", 3139a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, vendor_id); 3149a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 3159a5557fdSlucy wang - Sun Microsystems - Beijing China } 3169a5557fdSlucy wang - Sun Microsystems - Beijing China 3179a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, 3189a5557fdSlucy wang - Sun Microsystems - Beijing China dip, 0, "reg", ®_options, &noptions); 3199a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_PROP_SUCCESS) { 3209a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Could not determine reg property\n", 3219a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 3229a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 3239a5557fdSlucy wang - Sun Microsystems - Beijing China } 3249a5557fdSlucy wang - Sun Microsystems - Beijing China 3259a5557fdSlucy wang - Sun Microsystems - Beijing China hwcontext->pci_func = (reg_options[0] >> 8) & 0x7; 3269a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_prop_free(reg_options); 3279a5557fdSlucy wang - Sun Microsystems - Beijing China 3289a5557fdSlucy wang - Sun Microsystems - Beijing China base_class = pci_config_get8(pci_cfg_hdl, PCI_CONF_BASCLASS); 3299a5557fdSlucy wang - Sun Microsystems - Beijing China sub_class = pci_config_get8(pci_cfg_hdl, PCI_CONF_SUBCLASS); 3309a5557fdSlucy wang - Sun Microsystems - Beijing China prog_class = pci_config_get8(pci_cfg_hdl, PCI_CONF_PROGCLASS); 3319a5557fdSlucy wang - Sun Microsystems - Beijing China 3329a5557fdSlucy wang - Sun Microsystems - Beijing China /* 3339a5557fdSlucy wang - Sun Microsystems - Beijing China * Need this check so that MEZZ card mgmt interface ntxn0 could fail 3349a5557fdSlucy wang - Sun Microsystems - Beijing China * attach & return and proceed to next interfaces ntxn1 and ntxn2 3359a5557fdSlucy wang - Sun Microsystems - Beijing China */ 3369a5557fdSlucy wang - Sun Microsystems - Beijing China if ((base_class != 0x02) || (sub_class != 0) || (prog_class != 0)) { 3379a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Base/sub/prog class problem %d/%d/%d\n", 3389a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, base_class, sub_class, 3399a5557fdSlucy wang - Sun Microsystems - Beijing China prog_class); 3409a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 3419a5557fdSlucy wang - Sun Microsystems - Beijing China } 3429a5557fdSlucy wang - Sun Microsystems - Beijing China 3439a5557fdSlucy wang - Sun Microsystems - Beijing China hwcontext->revision_id = pci_config_get8(pci_cfg_hdl, PCI_CONF_REVID); 3449a5557fdSlucy wang - Sun Microsystems - Beijing China 3459a5557fdSlucy wang - Sun Microsystems - Beijing China /* 3469a5557fdSlucy wang - Sun Microsystems - Beijing China * Refuse to work with dubious P3 cards. 3479a5557fdSlucy wang - Sun Microsystems - Beijing China */ 3489a5557fdSlucy wang - Sun Microsystems - Beijing China if ((hwcontext->revision_id >= NX_P3_A0) && 3499a5557fdSlucy wang - Sun Microsystems - Beijing China (hwcontext->revision_id < NX_P3_B1)) { 3509a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: NetXen chip revs between 0x%x-0x%x " 3519a5557fdSlucy wang - Sun Microsystems - Beijing China "is unsupported\n", adapter->name, adapter->instance, 3529a5557fdSlucy wang - Sun Microsystems - Beijing China NX_P3_A0, NX_P3_B0); 3539a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 3549a5557fdSlucy wang - Sun Microsystems - Beijing China } 3559a5557fdSlucy wang - Sun Microsystems - Beijing China 3569a5557fdSlucy wang - Sun Microsystems - Beijing China /* 3579a5557fdSlucy wang - Sun Microsystems - Beijing China * Save error reporting settings; clear [19:16] error status bits. 3589a5557fdSlucy wang - Sun Microsystems - Beijing China * Set max read request [14:12] to 0 for 128 bytes. Set max payload 3599a5557fdSlucy wang - Sun Microsystems - Beijing China * size[7:5] to 0 for for 128 bytes. 3609a5557fdSlucy wang - Sun Microsystems - Beijing China */ 3619a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P2(hwcontext->revision_id)) { 3629a5557fdSlucy wang - Sun Microsystems - Beijing China pexsizes = pci_config_get32(pci_cfg_hdl, 0xd8); 3639a5557fdSlucy wang - Sun Microsystems - Beijing China pexsizes &= 7; 3649a5557fdSlucy wang - Sun Microsystems - Beijing China pexsizes |= 0xF0000; 3659a5557fdSlucy wang - Sun Microsystems - Beijing China pci_config_put32(pci_cfg_hdl, 0xd8, pexsizes); 3669a5557fdSlucy wang - Sun Microsystems - Beijing China } 3679a5557fdSlucy wang - Sun Microsystems - Beijing China 3689a5557fdSlucy wang - Sun Microsystems - Beijing China pci_cmd_word = pci_config_get16(pci_cfg_hdl, PCI_CONF_COMM); 3699a5557fdSlucy wang - Sun Microsystems - Beijing China pci_cmd_word |= (PCI_COMM_INTX_DISABLE | PCI_COMM_SERR_ENABLE); 3709a5557fdSlucy wang - Sun Microsystems - Beijing China pci_config_put16(pci_cfg_hdl, PCI_CONF_COMM, pci_cmd_word); 3719a5557fdSlucy wang - Sun Microsystems - Beijing China 3729a5557fdSlucy wang - Sun Microsystems - Beijing China if (hwcontext->revision_id >= NX_P3_B0) 3739a5557fdSlucy wang - Sun Microsystems - Beijing China legacy_intrp = &legacy_intr[hwcontext->pci_func]; 3749a5557fdSlucy wang - Sun Microsystems - Beijing China else 3759a5557fdSlucy wang - Sun Microsystems - Beijing China legacy_intrp = &legacy_intr[0]; 3769a5557fdSlucy wang - Sun Microsystems - Beijing China 3779a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.int_vec_bit = legacy_intrp->int_vec_bit; 3789a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.tgt_status_reg = legacy_intrp->tgt_status_reg; 3799a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.tgt_mask_reg = legacy_intrp->tgt_mask_reg; 3809a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->legacy_intr.pci_int_reg = legacy_intrp->pci_int_reg; 3819a5557fdSlucy wang - Sun Microsystems - Beijing China 3829a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 3839a5557fdSlucy wang - Sun Microsystems - Beijing China } 3849a5557fdSlucy wang - Sun Microsystems - Beijing China 385dda0720aSjing xiong ERI-SUN static void 3869a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_tx_dmahdl(unm_adapter *adapter) 3879a5557fdSlucy wang - Sun Microsystems - Beijing China { 3889a5557fdSlucy wang - Sun Microsystems - Beijing China int i; 3899a5557fdSlucy wang - Sun Microsystems - Beijing China unm_dmah_node_t *nodep; 3909a5557fdSlucy wang - Sun Microsystems - Beijing China 3919a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_enter(&adapter->tx_lock); 3929a5557fdSlucy wang - Sun Microsystems - Beijing China nodep = &adapter->tx_dma_hdls[0]; 3939a5557fdSlucy wang - Sun Microsystems - Beijing China 3949a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount + EXTRA_HANDLES; i++) { 3959a5557fdSlucy wang - Sun Microsystems - Beijing China if (nodep->dmahdl != NULL) { 3969a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_dma_free_handle(&nodep->dmahdl); 3979a5557fdSlucy wang - Sun Microsystems - Beijing China nodep->dmahdl = NULL; 3989a5557fdSlucy wang - Sun Microsystems - Beijing China } 3999a5557fdSlucy wang - Sun Microsystems - Beijing China nodep->next = NULL; 4009a5557fdSlucy wang - Sun Microsystems - Beijing China nodep++; 4019a5557fdSlucy wang - Sun Microsystems - Beijing China } 4029a5557fdSlucy wang - Sun Microsystems - Beijing China 4039a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->dmahdl_pool = NULL; 4049a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->freehdls = 0; 4059a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_exit(&adapter->tx_lock); 4069a5557fdSlucy wang - Sun Microsystems - Beijing China } 4079a5557fdSlucy wang - Sun Microsystems - Beijing China 4089a5557fdSlucy wang - Sun Microsystems - Beijing China static int 4099a5557fdSlucy wang - Sun Microsystems - Beijing China unm_alloc_tx_dmahdl(unm_adapter *adapter) 4109a5557fdSlucy wang - Sun Microsystems - Beijing China { 4119a5557fdSlucy wang - Sun Microsystems - Beijing China int i; 4129a5557fdSlucy wang - Sun Microsystems - Beijing China unm_dmah_node_t *nodep = &adapter->tx_dma_hdls[0]; 4139a5557fdSlucy wang - Sun Microsystems - Beijing China 4149a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_enter(&adapter->tx_lock); 4159a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount + EXTRA_HANDLES; i++) { 4169a5557fdSlucy wang - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(adapter->dip, &unm_dma_attr_cmddesc, 4179a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DMA_DONTWAIT, NULL, &nodep->dmahdl) != DDI_SUCCESS) { 4189a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_exit(&adapter->tx_lock); 4199a5557fdSlucy wang - Sun Microsystems - Beijing China goto alloc_hdl_fail; 4209a5557fdSlucy wang - Sun Microsystems - Beijing China } 4219a5557fdSlucy wang - Sun Microsystems - Beijing China 4229a5557fdSlucy wang - Sun Microsystems - Beijing China if (i > 0) 4239a5557fdSlucy wang - Sun Microsystems - Beijing China nodep->next = nodep - 1; 4249a5557fdSlucy wang - Sun Microsystems - Beijing China nodep++; 4259a5557fdSlucy wang - Sun Microsystems - Beijing China } 4269a5557fdSlucy wang - Sun Microsystems - Beijing China 4279a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->dmahdl_pool = nodep - 1; 4289a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->freehdls = i; 4299a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_exit(&adapter->tx_lock); 4309a5557fdSlucy wang - Sun Microsystems - Beijing China 4319a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 4329a5557fdSlucy wang - Sun Microsystems - Beijing China 4339a5557fdSlucy wang - Sun Microsystems - Beijing China alloc_hdl_fail: 4349a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_tx_dmahdl(adapter); 4359a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed transmit ring dma handle allocation\n", 4369a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 4379a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 4389a5557fdSlucy wang - Sun Microsystems - Beijing China } 4399a5557fdSlucy wang - Sun Microsystems - Beijing China 4409a5557fdSlucy wang - Sun Microsystems - Beijing China static void 4419a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_area_t *dma_p) 4429a5557fdSlucy wang - Sun Microsystems - Beijing China { 4439a5557fdSlucy wang - Sun Microsystems - Beijing China if (dma_p->dma_hdl != NULL) { 4449a5557fdSlucy wang - Sun Microsystems - Beijing China if (dma_p->ncookies) { 4459a5557fdSlucy wang - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(dma_p->dma_hdl); 4469a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p->ncookies = 0; 4479a5557fdSlucy wang - Sun Microsystems - Beijing China } 4489a5557fdSlucy wang - Sun Microsystems - Beijing China } 4499a5557fdSlucy wang - Sun Microsystems - Beijing China if (dma_p->acc_hdl != NULL) { 4509a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_dma_mem_free(&dma_p->acc_hdl); 4519a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p->acc_hdl = NULL; 4529a5557fdSlucy wang - Sun Microsystems - Beijing China } 4539a5557fdSlucy wang - Sun Microsystems - Beijing China if (dma_p->dma_hdl != NULL) { 4549a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_dma_free_handle(&dma_p->dma_hdl); 4559a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p->dma_hdl = NULL; 4569a5557fdSlucy wang - Sun Microsystems - Beijing China } 4579a5557fdSlucy wang - Sun Microsystems - Beijing China } 4589a5557fdSlucy wang - Sun Microsystems - Beijing China 4599a5557fdSlucy wang - Sun Microsystems - Beijing China static int 4609a5557fdSlucy wang - Sun Microsystems - Beijing China unm_alloc_dma_mem(unm_adapter *adapter, int size, uint_t dma_flag, 4619a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_dma_attr_t *dma_attr_p, dma_area_t *dma_p) 4629a5557fdSlucy wang - Sun Microsystems - Beijing China { 4639a5557fdSlucy wang - Sun Microsystems - Beijing China int ret; 4649a5557fdSlucy wang - Sun Microsystems - Beijing China caddr_t vaddr; 4659a5557fdSlucy wang - Sun Microsystems - Beijing China size_t actual_size; 4669a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_dma_cookie_t cookie; 4679a5557fdSlucy wang - Sun Microsystems - Beijing China 4689a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_dma_alloc_handle(adapter->dip, 4699a5557fdSlucy wang - Sun Microsystems - Beijing China dma_attr_p, DDI_DMA_DONTWAIT, 4709a5557fdSlucy wang - Sun Microsystems - Beijing China NULL, &dma_p->dma_hdl); 4719a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 4729a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed ddi_dma_alloc_handle\n", 4739a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 4749a5557fdSlucy wang - Sun Microsystems - Beijing China goto dma_mem_fail; 4759a5557fdSlucy wang - Sun Microsystems - Beijing China } 4769a5557fdSlucy wang - Sun Microsystems - Beijing China 4779a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_dma_mem_alloc(dma_p->dma_hdl, 4789a5557fdSlucy wang - Sun Microsystems - Beijing China size, &adapter->gc_attr_desc, 4799a5557fdSlucy wang - Sun Microsystems - Beijing China dma_flag & (DDI_DMA_STREAMING | DDI_DMA_CONSISTENT), 4809a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DMA_DONTWAIT, NULL, &vaddr, &actual_size, 4819a5557fdSlucy wang - Sun Microsystems - Beijing China &dma_p->acc_hdl); 4829a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 4839a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_dma_mem_alloc() failed\n", 4849a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 4859a5557fdSlucy wang - Sun Microsystems - Beijing China goto dma_mem_fail; 4869a5557fdSlucy wang - Sun Microsystems - Beijing China } 4879a5557fdSlucy wang - Sun Microsystems - Beijing China 4889a5557fdSlucy wang - Sun Microsystems - Beijing China if (actual_size < size) { 4899a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_dma_mem_alloc() allocated small\n", 4909a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 4919a5557fdSlucy wang - Sun Microsystems - Beijing China goto dma_mem_fail; 4929a5557fdSlucy wang - Sun Microsystems - Beijing China } 4939a5557fdSlucy wang - Sun Microsystems - Beijing China 4949a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_dma_addr_bind_handle(dma_p->dma_hdl, 4959a5557fdSlucy wang - Sun Microsystems - Beijing China NULL, vaddr, size, dma_flag, DDI_DMA_DONTWAIT, 4969a5557fdSlucy wang - Sun Microsystems - Beijing China NULL, &cookie, &dma_p->ncookies); 4979a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_DMA_MAPPED || dma_p->ncookies != 1) { 4989a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_dma_addr_bind_handle() failed, " 4999a5557fdSlucy wang - Sun Microsystems - Beijing China "%d, %d\n", adapter->name, adapter->instance, ret, 5009a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p->ncookies); 5019a5557fdSlucy wang - Sun Microsystems - Beijing China goto dma_mem_fail; 5029a5557fdSlucy wang - Sun Microsystems - Beijing China } 5039a5557fdSlucy wang - Sun Microsystems - Beijing China 5049a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p->dma_addr = cookie.dmac_laddress; 5059a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p->vaddr = vaddr; 5069a5557fdSlucy wang - Sun Microsystems - Beijing China (void) memset(vaddr, 0, size); 5079a5557fdSlucy wang - Sun Microsystems - Beijing China 5089a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 5099a5557fdSlucy wang - Sun Microsystems - Beijing China 5109a5557fdSlucy wang - Sun Microsystems - Beijing China dma_mem_fail: 5119a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_p); 5129a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 5139a5557fdSlucy wang - Sun Microsystems - Beijing China } 5149a5557fdSlucy wang - Sun Microsystems - Beijing China 515dda0720aSjing xiong ERI-SUN static void 5169a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_tx_buffers(unm_adapter *adapter) 5179a5557fdSlucy wang - Sun Microsystems - Beijing China { 5189a5557fdSlucy wang - Sun Microsystems - Beijing China int i; 5199a5557fdSlucy wang - Sun Microsystems - Beijing China dma_area_t *dma_p; 5209a5557fdSlucy wang - Sun Microsystems - Beijing China struct unm_cmd_buffer *cmd_buf; 5219a5557fdSlucy wang - Sun Microsystems - Beijing China unm_dmah_node_t *nodep; 5229a5557fdSlucy wang - Sun Microsystems - Beijing China 5239a5557fdSlucy wang - Sun Microsystems - Beijing China cmd_buf = &adapter->cmd_buf_arr[0]; 5249a5557fdSlucy wang - Sun Microsystems - Beijing China 5259a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount; i++) { 5269a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p = &cmd_buf->dma_area; 5279a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_p); 5289a5557fdSlucy wang - Sun Microsystems - Beijing China nodep = cmd_buf->head; 5299a5557fdSlucy wang - Sun Microsystems - Beijing China while (nodep != NULL) { 5309a5557fdSlucy wang - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(nodep->dmahdl); 5319a5557fdSlucy wang - Sun Microsystems - Beijing China nodep = nodep->next; 5329a5557fdSlucy wang - Sun Microsystems - Beijing China } 5339a5557fdSlucy wang - Sun Microsystems - Beijing China if (cmd_buf->msg != NULL) 5349a5557fdSlucy wang - Sun Microsystems - Beijing China freemsg(cmd_buf->msg); 5359a5557fdSlucy wang - Sun Microsystems - Beijing China cmd_buf++; 5369a5557fdSlucy wang - Sun Microsystems - Beijing China } 5379a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->freecmds = 0; 5389a5557fdSlucy wang - Sun Microsystems - Beijing China } 5399a5557fdSlucy wang - Sun Microsystems - Beijing China 5409a5557fdSlucy wang - Sun Microsystems - Beijing China static int 5419a5557fdSlucy wang - Sun Microsystems - Beijing China unm_alloc_tx_buffers(unm_adapter *adapter) 5429a5557fdSlucy wang - Sun Microsystems - Beijing China { 5439a5557fdSlucy wang - Sun Microsystems - Beijing China int i, ret, size, allocated = 0; 5449a5557fdSlucy wang - Sun Microsystems - Beijing China dma_area_t *dma_p; 5459a5557fdSlucy wang - Sun Microsystems - Beijing China struct unm_cmd_buffer *cmd_buf; 5469a5557fdSlucy wang - Sun Microsystems - Beijing China 5479a5557fdSlucy wang - Sun Microsystems - Beijing China cmd_buf = &adapter->cmd_buf_arr[0]; 5489a5557fdSlucy wang - Sun Microsystems - Beijing China size = adapter->maxmtu; 5499a5557fdSlucy wang - Sun Microsystems - Beijing China 5509a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < adapter->MaxTxDescCount; i++) { 5519a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p = &cmd_buf->dma_area; 5529a5557fdSlucy wang - Sun Microsystems - Beijing China ret = unm_alloc_dma_mem(adapter, size, 5539a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DMA_WRITE | DDI_DMA_STREAMING, 5549a5557fdSlucy wang - Sun Microsystems - Beijing China &unm_dma_attr_rxbuf, dma_p); 5559a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) 5569a5557fdSlucy wang - Sun Microsystems - Beijing China goto alloc_tx_buffer_fail; 5579a5557fdSlucy wang - Sun Microsystems - Beijing China 5589a5557fdSlucy wang - Sun Microsystems - Beijing China allocated++; 5599a5557fdSlucy wang - Sun Microsystems - Beijing China cmd_buf++; 5609a5557fdSlucy wang - Sun Microsystems - Beijing China } 5619a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->freecmds = adapter->MaxTxDescCount; 5629a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 5639a5557fdSlucy wang - Sun Microsystems - Beijing China 5649a5557fdSlucy wang - Sun Microsystems - Beijing China alloc_tx_buffer_fail: 5659a5557fdSlucy wang - Sun Microsystems - Beijing China 5669a5557fdSlucy wang - Sun Microsystems - Beijing China cmd_buf = &adapter->cmd_buf_arr[0]; 5679a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < allocated; i++) { 5689a5557fdSlucy wang - Sun Microsystems - Beijing China dma_p = &cmd_buf->dma_area; 5699a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_p); 5709a5557fdSlucy wang - Sun Microsystems - Beijing China cmd_buf++; 5719a5557fdSlucy wang - Sun Microsystems - Beijing China } 5729a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed transmit ring memory allocation\n", 5739a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 5749a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 5759a5557fdSlucy wang - Sun Microsystems - Beijing China } 5769a5557fdSlucy wang - Sun Microsystems - Beijing China 5779a5557fdSlucy wang - Sun Microsystems - Beijing China /* 5789a5557fdSlucy wang - Sun Microsystems - Beijing China * Called by freemsg() to "free" the resource. 5799a5557fdSlucy wang - Sun Microsystems - Beijing China */ 5809a5557fdSlucy wang - Sun Microsystems - Beijing China static void 5819a5557fdSlucy wang - Sun Microsystems - Beijing China unm_rx_buffer_recycle(char *arg) 5829a5557fdSlucy wang - Sun Microsystems - Beijing China { 5839a5557fdSlucy wang - Sun Microsystems - Beijing China unm_rx_buffer_t *rx_buffer = (unm_rx_buffer_t *)(uintptr_t)arg; 5849a5557fdSlucy wang - Sun Microsystems - Beijing China unm_adapter *adapter = rx_buffer->adapter; 5859a5557fdSlucy wang - Sun Microsystems - Beijing China unm_rcv_desc_ctx_t *rcv_desc = rx_buffer->rcv_desc; 5869a5557fdSlucy wang - Sun Microsystems - Beijing China 5879a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->mp = desballoc(rx_buffer->dma_info.vaddr, 5889a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size, 0, &rx_buffer->rx_recycle); 5899a5557fdSlucy wang - Sun Microsystems - Beijing China 5909a5557fdSlucy wang - Sun Microsystems - Beijing China if (rx_buffer->mp == NULL) 5919a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->stats.desballocfailed++; 5929a5557fdSlucy wang - Sun Microsystems - Beijing China 5939a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_enter(rcv_desc->recycle_lock); 5949a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->next = rcv_desc->recycle_list; 5959a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->recycle_list = rx_buffer; 5969a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_recycle++; 5979a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_exit(rcv_desc->recycle_lock); 5989a5557fdSlucy wang - Sun Microsystems - Beijing China } 5999a5557fdSlucy wang - Sun Microsystems - Beijing China 600dda0720aSjing xiong ERI-SUN static void 6019a5557fdSlucy wang - Sun Microsystems - Beijing China unm_destroy_rx_ring(unm_rcv_desc_ctx_t *rcv_desc) 6029a5557fdSlucy wang - Sun Microsystems - Beijing China { 6039a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t i, total_buf; 6049a5557fdSlucy wang - Sun Microsystems - Beijing China unm_rx_buffer_t *buf_pool; 6059a5557fdSlucy wang - Sun Microsystems - Beijing China 6069a5557fdSlucy wang - Sun Microsystems - Beijing China total_buf = rcv_desc->rx_buf_total; 6079a5557fdSlucy wang - Sun Microsystems - Beijing China buf_pool = rcv_desc->rx_buf_pool; 6089a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < total_buf; i++) { 6099a5557fdSlucy wang - Sun Microsystems - Beijing China if (buf_pool->mp != NULL) 6109a5557fdSlucy wang - Sun Microsystems - Beijing China freemsg(buf_pool->mp); 6119a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(&buf_pool->dma_info); 6129a5557fdSlucy wang - Sun Microsystems - Beijing China buf_pool++; 6139a5557fdSlucy wang - Sun Microsystems - Beijing China } 6149a5557fdSlucy wang - Sun Microsystems - Beijing China 6159a5557fdSlucy wang - Sun Microsystems - Beijing China kmem_free(rcv_desc->rx_buf_pool, sizeof (unm_rx_buffer_t) * total_buf); 6169a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool = NULL; 6179a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->pool_list = NULL; 6189a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->recycle_list = NULL; 6199a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_free = 0; 6209a5557fdSlucy wang - Sun Microsystems - Beijing China 6219a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_destroy(rcv_desc->pool_lock); 6229a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_destroy(rcv_desc->recycle_lock); 6239a5557fdSlucy wang - Sun Microsystems - Beijing China } 6249a5557fdSlucy wang - Sun Microsystems - Beijing China 6259a5557fdSlucy wang - Sun Microsystems - Beijing China static int 6269a5557fdSlucy wang - Sun Microsystems - Beijing China unm_create_rx_ring(unm_adapter *adapter, unm_rcv_desc_ctx_t *rcv_desc) 6279a5557fdSlucy wang - Sun Microsystems - Beijing China { 6289a5557fdSlucy wang - Sun Microsystems - Beijing China int i, ret, allocate = 0, sreoff; 6299a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t total_buf; 6309a5557fdSlucy wang - Sun Microsystems - Beijing China dma_area_t *dma_info; 6319a5557fdSlucy wang - Sun Microsystems - Beijing China unm_rx_buffer_t *rx_buffer; 6329a5557fdSlucy wang - Sun Microsystems - Beijing China 6339a5557fdSlucy wang - Sun Microsystems - Beijing China sreoff = adapter->ahw.cut_through ? 0 : IP_ALIGNMENT_BYTES; 6349a5557fdSlucy wang - Sun Microsystems - Beijing China 6359a5557fdSlucy wang - Sun Microsystems - Beijing China /* temporarily set the total rx buffers two times of MaxRxDescCount */ 6369a5557fdSlucy wang - Sun Microsystems - Beijing China total_buf = rcv_desc->rx_buf_total = rcv_desc->MaxRxDescCount * 2; 6379a5557fdSlucy wang - Sun Microsystems - Beijing China 6389a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool = kmem_zalloc(sizeof (unm_rx_buffer_t) * 6399a5557fdSlucy wang - Sun Microsystems - Beijing China total_buf, KM_SLEEP); 6409a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer = rcv_desc->rx_buf_pool; 6419a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < total_buf; i++) { 6429a5557fdSlucy wang - Sun Microsystems - Beijing China dma_info = &rx_buffer->dma_info; 6439a5557fdSlucy wang - Sun Microsystems - Beijing China ret = unm_alloc_dma_mem(adapter, rcv_desc->buf_size, 6449a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DMA_READ | DDI_DMA_STREAMING, 6459a5557fdSlucy wang - Sun Microsystems - Beijing China &unm_dma_attr_rxbuf, dma_info); 6469a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) 6479a5557fdSlucy wang - Sun Microsystems - Beijing China goto alloc_mem_failed; 6489a5557fdSlucy wang - Sun Microsystems - Beijing China else { 6499a5557fdSlucy wang - Sun Microsystems - Beijing China allocate++; 6509a5557fdSlucy wang - Sun Microsystems - Beijing China dma_info->vaddr = (void *) ((char *)dma_info->vaddr + 6519a5557fdSlucy wang - Sun Microsystems - Beijing China sreoff); 6529a5557fdSlucy wang - Sun Microsystems - Beijing China dma_info->dma_addr += sreoff; 6539a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->rx_recycle.free_func = 6549a5557fdSlucy wang - Sun Microsystems - Beijing China unm_rx_buffer_recycle; 6559a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->rx_recycle.free_arg = (caddr_t)rx_buffer; 6569a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->next = NULL; 6579a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->mp = desballoc(dma_info->vaddr, 6589a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size, 0, &rx_buffer->rx_recycle); 6599a5557fdSlucy wang - Sun Microsystems - Beijing China if (rx_buffer->mp == NULL) 6609a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->stats.desballocfailed++; 6619a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->rcv_desc = rcv_desc; 6629a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer->adapter = adapter; 6639a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer++; 6649a5557fdSlucy wang - Sun Microsystems - Beijing China } 6659a5557fdSlucy wang - Sun Microsystems - Beijing China } 6669a5557fdSlucy wang - Sun Microsystems - Beijing China 6679a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < (total_buf - 1); i++) { 6689a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool[i].next = &rcv_desc->rx_buf_pool[i + 1]; 6699a5557fdSlucy wang - Sun Microsystems - Beijing China } 6709a5557fdSlucy wang - Sun Microsystems - Beijing China 6719a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->pool_list = rcv_desc->rx_buf_pool; 6729a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->recycle_list = NULL; 6739a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_free = total_buf; 6749a5557fdSlucy wang - Sun Microsystems - Beijing China 6759a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_init(rcv_desc->pool_lock, NULL, 6769a5557fdSlucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri))); 6779a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_init(rcv_desc->recycle_lock, NULL, 6789a5557fdSlucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri))); 6799a5557fdSlucy wang - Sun Microsystems - Beijing China 6809a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 6819a5557fdSlucy wang - Sun Microsystems - Beijing China 6829a5557fdSlucy wang - Sun Microsystems - Beijing China alloc_mem_failed: 6839a5557fdSlucy wang - Sun Microsystems - Beijing China rx_buffer = rcv_desc->rx_buf_pool; 6849a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < allocate; i++, rx_buffer++) { 6859a5557fdSlucy wang - Sun Microsystems - Beijing China dma_info = &rx_buffer->dma_info; 6869a5557fdSlucy wang - Sun Microsystems - Beijing China if (rx_buffer->mp != NULL) 6879a5557fdSlucy wang - Sun Microsystems - Beijing China freemsg(rx_buffer->mp); 6889a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dma_mem(dma_info); 6899a5557fdSlucy wang - Sun Microsystems - Beijing China } 6909a5557fdSlucy wang - Sun Microsystems - Beijing China 6919a5557fdSlucy wang - Sun Microsystems - Beijing China kmem_free(rcv_desc->rx_buf_pool, sizeof (unm_rx_buffer_t) * total_buf); 6929a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->rx_buf_pool = NULL; 6939a5557fdSlucy wang - Sun Microsystems - Beijing China 6949a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed receive ring resource allocation\n", 6959a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 6969a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 6979a5557fdSlucy wang - Sun Microsystems - Beijing China } 6989a5557fdSlucy wang - Sun Microsystems - Beijing China 6999a5557fdSlucy wang - Sun Microsystems - Beijing China static void 7009a5557fdSlucy wang - Sun Microsystems - Beijing China unm_check_options(unm_adapter *adapter) 7019a5557fdSlucy wang - Sun Microsystems - Beijing China { 702dda0720aSjing xiong ERI-SUN int i, ring, tx_desc, rx_desc, rx_jdesc, maxrx; 7039a5557fdSlucy wang - Sun Microsystems - Beijing China unm_recv_context_t *recv_ctx; 7049a5557fdSlucy wang - Sun Microsystems - Beijing China unm_rcv_desc_ctx_t *rcv_desc; 7059a5557fdSlucy wang - Sun Microsystems - Beijing China uint8_t revid = adapter->ahw.revision_id; 7069a5557fdSlucy wang - Sun Microsystems - Beijing China dev_info_t *dip = adapter->dip; 7079a5557fdSlucy wang - Sun Microsystems - Beijing China 708dda0720aSjing xiong ERI-SUN /* 709dda0720aSjing xiong ERI-SUN * Reduce number of regular rcv desc to half on x86. 710dda0720aSjing xiong ERI-SUN */ 711dda0720aSjing xiong ERI-SUN maxrx = MAX_RCV_DESCRIPTORS; 712dda0720aSjing xiong ERI-SUN #if !defined(_LP64) 713dda0720aSjing xiong ERI-SUN maxrx /= 2; 714dda0720aSjing xiong ERI-SUN #endif /* !_LP64 */ 715dda0720aSjing xiong ERI-SUN 7169a5557fdSlucy wang - Sun Microsystems - Beijing China verbmsg = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, 7179a5557fdSlucy wang - Sun Microsystems - Beijing China dmesg_propname, 0); 7189a5557fdSlucy wang - Sun Microsystems - Beijing China 7199a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->tx_bcopy_threshold = ddi_prop_get_int(DDI_DEV_T_ANY, 7209a5557fdSlucy wang - Sun Microsystems - Beijing China dip, DDI_PROP_DONTPASS, txbcopythreshold_propname, 7219a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_TX_BCOPY_THRESHOLD); 7229a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->rx_bcopy_threshold = ddi_prop_get_int(DDI_DEV_T_ANY, 7239a5557fdSlucy wang - Sun Microsystems - Beijing China dip, DDI_PROP_DONTPASS, rxbcopythreshold_propname, 7249a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_RX_BCOPY_THRESHOLD); 7259a5557fdSlucy wang - Sun Microsystems - Beijing China 7269a5557fdSlucy wang - Sun Microsystems - Beijing China tx_desc = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, 7279a5557fdSlucy wang - Sun Microsystems - Beijing China txringsize_propname, MAX_CMD_DESCRIPTORS_HOST); 728*de710d24SJosef 'Jeff' Sipek if (tx_desc >= 256 && tx_desc <= MAX_CMD_DESCRIPTORS && ISP2(tx_desc)) { 7299a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxTxDescCount = tx_desc; 7309a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 7319a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: TxRingSize defaulting to %d, since " 7329a5557fdSlucy wang - Sun Microsystems - Beijing China ".conf value is not 2 power aligned in range 256 - %d\n", 7339a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, MAX_CMD_DESCRIPTORS_HOST, 7349a5557fdSlucy wang - Sun Microsystems - Beijing China MAX_CMD_DESCRIPTORS); 7359a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxTxDescCount = MAX_CMD_DESCRIPTORS_HOST; 7369a5557fdSlucy wang - Sun Microsystems - Beijing China } 7379a5557fdSlucy wang - Sun Microsystems - Beijing China 7389a5557fdSlucy wang - Sun Microsystems - Beijing China rx_desc = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, 739dda0720aSjing xiong ERI-SUN rxringsize_propname, maxrx); 7409a5557fdSlucy wang - Sun Microsystems - Beijing China if (rx_desc >= NX_MIN_DRIVER_RDS_SIZE && 741*de710d24SJosef 'Jeff' Sipek rx_desc <= NX_MAX_SUPPORTED_RDS_SIZE && ISP2(rx_desc)) { 7429a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxRxDescCount = rx_desc; 7439a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 7449a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: RxRingSize defaulting to %d, since " 7459a5557fdSlucy wang - Sun Microsystems - Beijing China ".conf value is not 2 power aligned in range %d - %d\n", 7469a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, MAX_RCV_DESCRIPTORS, 7479a5557fdSlucy wang - Sun Microsystems - Beijing China NX_MIN_DRIVER_RDS_SIZE, NX_MAX_SUPPORTED_RDS_SIZE); 7489a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxRxDescCount = MAX_RCV_DESCRIPTORS; 7499a5557fdSlucy wang - Sun Microsystems - Beijing China } 7509a5557fdSlucy wang - Sun Microsystems - Beijing China 7519a5557fdSlucy wang - Sun Microsystems - Beijing China rx_jdesc = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, 7529a5557fdSlucy wang - Sun Microsystems - Beijing China jumborxringsize_propname, MAX_JUMBO_RCV_DESCRIPTORS); 7539a5557fdSlucy wang - Sun Microsystems - Beijing China if (rx_jdesc >= NX_MIN_DRIVER_RDS_SIZE && 754*de710d24SJosef 'Jeff' Sipek rx_jdesc <= NX_MAX_SUPPORTED_JUMBO_RDS_SIZE && ISP2(rx_jdesc)) { 7559a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxJumboRxDescCount = rx_jdesc; 7569a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 7579a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: JumboRingSize defaulting to %d, since " 7589a5557fdSlucy wang - Sun Microsystems - Beijing China ".conf value is not 2 power aligned in range %d - %d\n", 7599a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, MAX_JUMBO_RCV_DESCRIPTORS, 7609a5557fdSlucy wang - Sun Microsystems - Beijing China NX_MIN_DRIVER_RDS_SIZE, NX_MAX_SUPPORTED_JUMBO_RDS_SIZE); 7619a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxJumboRxDescCount = MAX_JUMBO_RCV_DESCRIPTORS; 7629a5557fdSlucy wang - Sun Microsystems - Beijing China } 7639a5557fdSlucy wang - Sun Microsystems - Beijing China 764dda0720aSjing xiong ERI-SUN /* 765dda0720aSjing xiong ERI-SUN * Solaris does not use LRO, but older firmware needs to have a 766dda0720aSjing xiong ERI-SUN * couple of descriptors for initialization. 767dda0720aSjing xiong ERI-SUN */ 768dda0720aSjing xiong ERI-SUN adapter->MaxLroRxDescCount = (adapter->fw_major < 4) ? 2 : 0; 7699a5557fdSlucy wang - Sun Microsystems - Beijing China 7709a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->mtu = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 7719a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_PROP_DONTPASS, defaultmtu_propname, MTU_SIZE); 7729a5557fdSlucy wang - Sun Microsystems - Beijing China 7739a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->mtu < MTU_SIZE) { 7749a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Raising mtu to %d\n", MTU_SIZE); 7759a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->mtu = MTU_SIZE; 7769a5557fdSlucy wang - Sun Microsystems - Beijing China } 7779a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->maxmtu = NX_IS_REVISION_P2(revid) ? P2_MAX_MTU : P3_MAX_MTU; 7789a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->mtu > adapter->maxmtu) { 7799a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "Lowering mtu to %d\n", adapter->maxmtu); 7809a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->mtu = adapter->maxmtu; 7819a5557fdSlucy wang - Sun Microsystems - Beijing China } 7829a5557fdSlucy wang - Sun Microsystems - Beijing China 783dda0720aSjing xiong ERI-SUN adapter->maxmtu = adapter->mtu + NX_MAX_ETHERHDR; 784dda0720aSjing xiong ERI-SUN 785dda0720aSjing xiong ERI-SUN /* 786dda0720aSjing xiong ERI-SUN * If we are not expecting to receive jumbo frames, save memory and 787dda0720aSjing xiong ERI-SUN * do not allocate. 788dda0720aSjing xiong ERI-SUN */ 789dda0720aSjing xiong ERI-SUN if (adapter->mtu <= MTU_SIZE) 790dda0720aSjing xiong ERI-SUN adapter->MaxJumboRxDescCount = NX_MIN_DRIVER_RDS_SIZE; 7919a5557fdSlucy wang - Sun Microsystems - Beijing China 7929a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < MAX_RCV_CTX; ++i) { 7939a5557fdSlucy wang - Sun Microsystems - Beijing China recv_ctx = &adapter->recv_ctx[i]; 7949a5557fdSlucy wang - Sun Microsystems - Beijing China 7959a5557fdSlucy wang - Sun Microsystems - Beijing China for (ring = 0; ring < adapter->max_rds_rings; ring++) { 7969a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc = &recv_ctx->rcv_desc[ring]; 7979a5557fdSlucy wang - Sun Microsystems - Beijing China 7989a5557fdSlucy wang - Sun Microsystems - Beijing China switch (RCV_DESC_TYPE(ring)) { 7999a5557fdSlucy wang - Sun Microsystems - Beijing China case RCV_DESC_NORMAL: 8009a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->MaxRxDescCount = 8019a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxRxDescCount; 8029a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->ahw.cut_through) { 8039a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size = 8049a5557fdSlucy wang - Sun Microsystems - Beijing China NX_CT_DEFAULT_RX_BUF_LEN; 8059a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size = rcv_desc->dma_size; 8069a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 8079a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size = 8089a5557fdSlucy wang - Sun Microsystems - Beijing China NX_RX_NORMAL_BUF_MAX_LEN; 8099a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size = 8109a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size + 8119a5557fdSlucy wang - Sun Microsystems - Beijing China IP_ALIGNMENT_BYTES; 8129a5557fdSlucy wang - Sun Microsystems - Beijing China } 8139a5557fdSlucy wang - Sun Microsystems - Beijing China break; 8149a5557fdSlucy wang - Sun Microsystems - Beijing China 8159a5557fdSlucy wang - Sun Microsystems - Beijing China case RCV_DESC_JUMBO: 8169a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->MaxRxDescCount = 8179a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxJumboRxDescCount; 8189a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->ahw.cut_through) { 8199a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size = 8209a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size = 8219a5557fdSlucy wang - Sun Microsystems - Beijing China NX_P3_RX_JUMBO_BUF_MAX_LEN; 8229a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 8239a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P2(revid)) 8249a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size = 8259a5557fdSlucy wang - Sun Microsystems - Beijing China NX_P2_RX_JUMBO_BUF_MAX_LEN; 8269a5557fdSlucy wang - Sun Microsystems - Beijing China else 8279a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size = 8289a5557fdSlucy wang - Sun Microsystems - Beijing China NX_P3_RX_JUMBO_BUF_MAX_LEN; 8299a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size = 8309a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size + 8319a5557fdSlucy wang - Sun Microsystems - Beijing China IP_ALIGNMENT_BYTES; 8329a5557fdSlucy wang - Sun Microsystems - Beijing China } 8339a5557fdSlucy wang - Sun Microsystems - Beijing China break; 8349a5557fdSlucy wang - Sun Microsystems - Beijing China 8359a5557fdSlucy wang - Sun Microsystems - Beijing China case RCV_RING_LRO: 8369a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->MaxRxDescCount = 8379a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->MaxLroRxDescCount; 8389a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->buf_size = MAX_RX_LRO_BUFFER_LENGTH; 8399a5557fdSlucy wang - Sun Microsystems - Beijing China rcv_desc->dma_size = RX_LRO_DMA_MAP_LEN; 8409a5557fdSlucy wang - Sun Microsystems - Beijing China break; 8419a5557fdSlucy wang - Sun Microsystems - Beijing China default: 8429a5557fdSlucy wang - Sun Microsystems - Beijing China break; 8439a5557fdSlucy wang - Sun Microsystems - Beijing China } 8449a5557fdSlucy wang - Sun Microsystems - Beijing China } 8459a5557fdSlucy wang - Sun Microsystems - Beijing China } 8469a5557fdSlucy wang - Sun Microsystems - Beijing China } 8479a5557fdSlucy wang - Sun Microsystems - Beijing China 8489a5557fdSlucy wang - Sun Microsystems - Beijing China static void 8499a5557fdSlucy wang - Sun Microsystems - Beijing China vector128M(unm_adapter *aptr) 8509a5557fdSlucy wang - Sun Microsystems - Beijing China { 8519a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_change_crbwindow = &unm_nic_pci_change_crbwindow_128M; 8529a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_crb_writelit_adapter = &unm_crb_writelit_adapter_128M; 8539a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_wx = &unm_nic_hw_write_wx_128M; 8549a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_wx = &unm_nic_hw_read_wx_128M; 8559a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_ioctl = &unm_nic_hw_write_ioctl_128M; 8569a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_ioctl = &unm_nic_hw_read_ioctl_128M; 8579a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_write = &unm_nic_pci_mem_write_128M; 8589a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_read = &unm_nic_pci_mem_read_128M; 8599a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_immediate = &unm_nic_pci_write_immediate_128M; 8609a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_immediate = &unm_nic_pci_read_immediate_128M; 8619a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_normalize = &unm_nic_pci_write_normalize_128M; 8629a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_normalize = &unm_nic_pci_read_normalize_128M; 8639a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_set_window = &unm_nic_pci_set_window_128M; 8649a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_clear_statistics = &unm_nic_clear_statistics_128M; 8659a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_fill_statistics = &unm_nic_fill_statistics_128M; 8669a5557fdSlucy wang - Sun Microsystems - Beijing China } 8679a5557fdSlucy wang - Sun Microsystems - Beijing China 8689a5557fdSlucy wang - Sun Microsystems - Beijing China static void 8699a5557fdSlucy wang - Sun Microsystems - Beijing China vector2M(unm_adapter *aptr) 8709a5557fdSlucy wang - Sun Microsystems - Beijing China { 8719a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_change_crbwindow = &unm_nic_pci_change_crbwindow_2M; 8729a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_crb_writelit_adapter = &unm_crb_writelit_adapter_2M; 8739a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_wx = &unm_nic_hw_write_wx_2M; 8749a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_wx = &unm_nic_hw_read_wx_2M; 8759a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_write_ioctl = &unm_nic_hw_write_wx_2M; 8769a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_hw_read_ioctl = &unm_nic_hw_read_wx_2M; 8779a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_write = &unm_nic_pci_mem_write_2M; 8789a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_mem_read = &unm_nic_pci_mem_read_2M; 8799a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_immediate = &unm_nic_pci_write_immediate_2M; 8809a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_immediate = &unm_nic_pci_read_immediate_2M; 8819a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_write_normalize = &unm_nic_pci_write_normalize_2M; 8829a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_read_normalize = &unm_nic_pci_read_normalize_2M; 8839a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_pci_set_window = &unm_nic_pci_set_window_2M; 8849a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_clear_statistics = &unm_nic_clear_statistics_2M; 8859a5557fdSlucy wang - Sun Microsystems - Beijing China aptr->unm_nic_fill_statistics = &unm_nic_fill_statistics_2M; 8869a5557fdSlucy wang - Sun Microsystems - Beijing China } 8879a5557fdSlucy wang - Sun Microsystems - Beijing China 8889a5557fdSlucy wang - Sun Microsystems - Beijing China static int 8899a5557fdSlucy wang - Sun Microsystems - Beijing China unm_pci_map_setup(unm_adapter *adapter) 8909a5557fdSlucy wang - Sun Microsystems - Beijing China { 8919a5557fdSlucy wang - Sun Microsystems - Beijing China int ret; 8929a5557fdSlucy wang - Sun Microsystems - Beijing China caddr_t reg_base, db_base; 8939a5557fdSlucy wang - Sun Microsystems - Beijing China caddr_t mem_ptr0, mem_ptr1 = NULL, mem_ptr2 = NULL; 8949a5557fdSlucy wang - Sun Microsystems - Beijing China unsigned long pci_len0; 8959a5557fdSlucy wang - Sun Microsystems - Beijing China unsigned long first_page_group_start, first_page_group_end; 8969a5557fdSlucy wang - Sun Microsystems - Beijing China 8979a5557fdSlucy wang - Sun Microsystems - Beijing China off_t regsize, dbsize = UNM_DB_MAPSIZE_BYTES; 8989a5557fdSlucy wang - Sun Microsystems - Beijing China dev_info_t *dip = adapter->dip; 8999a5557fdSlucy wang - Sun Microsystems - Beijing China 9009a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.qdr_sn_window = adapter->ahw.ddr_mn_window = -1; 9019a5557fdSlucy wang - Sun Microsystems - Beijing China 9029a5557fdSlucy wang - Sun Microsystems - Beijing China /* map register space */ 9039a5557fdSlucy wang - Sun Microsystems - Beijing China 9049a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_dev_regsize(dip, 1, ®size); 9059a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 9069a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: failed to read reg size for bar0\n", 9079a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 9089a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 9099a5557fdSlucy wang - Sun Microsystems - Beijing China } 9109a5557fdSlucy wang - Sun Microsystems - Beijing China 9119a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_regs_map_setup(dip, 1, ®_base, 0, 9129a5557fdSlucy wang - Sun Microsystems - Beijing China regsize, &unm_dev_attr, &adapter->regs_handle); 9139a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 9149a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: failed to map registers\n", 9159a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 9169a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 9179a5557fdSlucy wang - Sun Microsystems - Beijing China } 9189a5557fdSlucy wang - Sun Microsystems - Beijing China 9199a5557fdSlucy wang - Sun Microsystems - Beijing China mem_ptr0 = reg_base; 9209a5557fdSlucy wang - Sun Microsystems - Beijing China 9219a5557fdSlucy wang - Sun Microsystems - Beijing China if (regsize == UNM_PCI_128MB_SIZE) { 9229a5557fdSlucy wang - Sun Microsystems - Beijing China pci_len0 = FIRST_PAGE_GROUP_SIZE; 9239a5557fdSlucy wang - Sun Microsystems - Beijing China mem_ptr1 = mem_ptr0 + SECOND_PAGE_GROUP_START; 9249a5557fdSlucy wang - Sun Microsystems - Beijing China mem_ptr2 = mem_ptr0 + THIRD_PAGE_GROUP_START; 9259a5557fdSlucy wang - Sun Microsystems - Beijing China first_page_group_start = FIRST_PAGE_GROUP_START; 9269a5557fdSlucy wang - Sun Microsystems - Beijing China first_page_group_end = FIRST_PAGE_GROUP_END; 9279a5557fdSlucy wang - Sun Microsystems - Beijing China vector128M(adapter); 9289a5557fdSlucy wang - Sun Microsystems - Beijing China } else if (regsize == UNM_PCI_32MB_SIZE) { 9299a5557fdSlucy wang - Sun Microsystems - Beijing China pci_len0 = 0; 9309a5557fdSlucy wang - Sun Microsystems - Beijing China mem_ptr1 = mem_ptr0; 9319a5557fdSlucy wang - Sun Microsystems - Beijing China mem_ptr2 = mem_ptr0 + 9329a5557fdSlucy wang - Sun Microsystems - Beijing China (THIRD_PAGE_GROUP_START - SECOND_PAGE_GROUP_START); 9339a5557fdSlucy wang - Sun Microsystems - Beijing China first_page_group_start = 0; 9349a5557fdSlucy wang - Sun Microsystems - Beijing China first_page_group_end = 0; 9359a5557fdSlucy wang - Sun Microsystems - Beijing China vector128M(adapter); 9369a5557fdSlucy wang - Sun Microsystems - Beijing China } else if (regsize == UNM_PCI_2MB_SIZE) { 9379a5557fdSlucy wang - Sun Microsystems - Beijing China pci_len0 = UNM_PCI_2MB_SIZE; 9389a5557fdSlucy wang - Sun Microsystems - Beijing China first_page_group_start = 0; 9399a5557fdSlucy wang - Sun Microsystems - Beijing China first_page_group_end = 0; 9409a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.ddr_mn_window = adapter->ahw.qdr_sn_window = 0; 9419a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.mn_win_crb = 0x100000 + PCIX_MN_WINDOW + 9429a5557fdSlucy wang - Sun Microsystems - Beijing China (adapter->ahw.pci_func * 0x20); 9439a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->ahw.pci_func < 4) 9449a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.ms_win_crb = 0x100000 + PCIX_SN_WINDOW + 9459a5557fdSlucy wang - Sun Microsystems - Beijing China (adapter->ahw.pci_func * 0x20); 9469a5557fdSlucy wang - Sun Microsystems - Beijing China else 9479a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.ms_win_crb = 0x100000 + PCIX_SN_WINDOW + 9489a5557fdSlucy wang - Sun Microsystems - Beijing China 0xA0 + ((adapter->ahw.pci_func - 4) * 0x10); 9499a5557fdSlucy wang - Sun Microsystems - Beijing China vector2M(adapter); 9509a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 9519a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: invalid pci regs map size %ld\n", 9529a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance, regsize); 9539a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&adapter->regs_handle); 9549a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 9559a5557fdSlucy wang - Sun Microsystems - Beijing China } 9569a5557fdSlucy wang - Sun Microsystems - Beijing China 9579a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_base0 = (unsigned long)mem_ptr0; 9589a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_len0 = pci_len0; 9599a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_base1 = (unsigned long)mem_ptr1; 9609a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_len1 = SECOND_PAGE_GROUP_SIZE; 9619a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_base2 = (unsigned long)mem_ptr2; 9629a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.pci_len2 = THIRD_PAGE_GROUP_SIZE; 9639a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.crb_base = 9649a5557fdSlucy wang - Sun Microsystems - Beijing China PCI_OFFSET_SECOND_RANGE(adapter, UNM_PCI_CRBSPACE); 9659a5557fdSlucy wang - Sun Microsystems - Beijing China 9669a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.first_page_group_start = first_page_group_start; 9679a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.first_page_group_end = first_page_group_end; 9689a5557fdSlucy wang - Sun Microsystems - Beijing China 9699a5557fdSlucy wang - Sun Microsystems - Beijing China /* map doorbell */ 9709a5557fdSlucy wang - Sun Microsystems - Beijing China 9719a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_regs_map_setup(dip, 2, &db_base, 0, 9729a5557fdSlucy wang - Sun Microsystems - Beijing China dbsize, &unm_dev_attr, &adapter->db_handle); 9739a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 9749a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: failed to map doorbell\n", 9759a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 9769a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&adapter->regs_handle); 9779a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 9789a5557fdSlucy wang - Sun Microsystems - Beijing China } 9799a5557fdSlucy wang - Sun Microsystems - Beijing China 9809a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.db_base = (unsigned long)db_base; 9819a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.db_len = dbsize; 9829a5557fdSlucy wang - Sun Microsystems - Beijing China 9839a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 9849a5557fdSlucy wang - Sun Microsystems - Beijing China } 9859a5557fdSlucy wang - Sun Microsystems - Beijing China 9869a5557fdSlucy wang - Sun Microsystems - Beijing China static int 9879a5557fdSlucy wang - Sun Microsystems - Beijing China unm_initialize_intr(unm_adapter *adapter) 9889a5557fdSlucy wang - Sun Microsystems - Beijing China { 9899a5557fdSlucy wang - Sun Microsystems - Beijing China 9909a5557fdSlucy wang - Sun Microsystems - Beijing China int ret; 9919a5557fdSlucy wang - Sun Microsystems - Beijing China int type, count, avail, actual; 9929a5557fdSlucy wang - Sun Microsystems - Beijing China 9939a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_supported_types(adapter->dip, &type); 9949a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 9959a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_intr_get_supported_types() " 9969a5557fdSlucy wang - Sun Microsystems - Beijing China "failed\n", adapter->name, adapter->instance); 9979a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 9989a5557fdSlucy wang - Sun Microsystems - Beijing China } 9999a5557fdSlucy wang - Sun Microsystems - Beijing China 10009a5557fdSlucy wang - Sun Microsystems - Beijing China type = DDI_INTR_TYPE_MSI; 10019a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_nintrs(adapter->dip, type, &count); 10029a5557fdSlucy wang - Sun Microsystems - Beijing China if ((ret == DDI_SUCCESS) && (count > 0)) 10039a5557fdSlucy wang - Sun Microsystems - Beijing China goto found_msi; 10049a5557fdSlucy wang - Sun Microsystems - Beijing China 10059a5557fdSlucy wang - Sun Microsystems - Beijing China type = DDI_INTR_TYPE_FIXED; 10069a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_nintrs(adapter->dip, type, &count); 10079a5557fdSlucy wang - Sun Microsystems - Beijing China if ((ret != DDI_SUCCESS) || (count == 0)) { 10089a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, 10099a5557fdSlucy wang - Sun Microsystems - Beijing China "ddi_intr_get_nintrs() failure ret=%d\n", ret); 10109a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 10119a5557fdSlucy wang - Sun Microsystems - Beijing China } 10129a5557fdSlucy wang - Sun Microsystems - Beijing China 10139a5557fdSlucy wang - Sun Microsystems - Beijing China found_msi: 10149a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->intr_type = type; 10159a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->flags &= ~(UNM_NIC_MSI_ENABLED | UNM_NIC_MSIX_ENABLED); 10169a5557fdSlucy wang - Sun Microsystems - Beijing China if (type == DDI_INTR_TYPE_MSI) 10179a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->flags |= UNM_NIC_MSI_ENABLED; 10189a5557fdSlucy wang - Sun Microsystems - Beijing China 10199a5557fdSlucy wang - Sun Microsystems - Beijing China /* Get number of available interrupts */ 10209a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_navail(adapter->dip, type, &avail); 10219a5557fdSlucy wang - Sun Microsystems - Beijing China if ((ret != DDI_SUCCESS) || (avail == 0)) { 10229a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ddi_intr_get_navail() failure, ret=%d\n", 10239a5557fdSlucy wang - Sun Microsystems - Beijing China ret); 10249a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 10259a5557fdSlucy wang - Sun Microsystems - Beijing China } 10269a5557fdSlucy wang - Sun Microsystems - Beijing China 10279a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_intr_alloc(adapter->dip, &adapter->intr_handle, 10289a5557fdSlucy wang - Sun Microsystems - Beijing China type, 0, 1, &actual, DDI_INTR_ALLOC_NORMAL); 10299a5557fdSlucy wang - Sun Microsystems - Beijing China if ((ret != DDI_SUCCESS) || (actual == 0)) { 10309a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ddi_intr_alloc() failure: %d\n", ret); 10319a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 10329a5557fdSlucy wang - Sun Microsystems - Beijing China } 10339a5557fdSlucy wang - Sun Microsystems - Beijing China 10349a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_intr_get_pri(adapter->intr_handle, &adapter->intr_pri); 10359a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 10369a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ddi_intr_get_pri() failure: %d\n", ret); 10379a5557fdSlucy wang - Sun Microsystems - Beijing China } 10389a5557fdSlucy wang - Sun Microsystems - Beijing China 10399a5557fdSlucy wang - Sun Microsystems - Beijing China /* Call ddi_intr_add_handler() */ 10409a5557fdSlucy wang - Sun Microsystems - Beijing China ret = ddi_intr_add_handler(adapter->intr_handle, unm_intr, 10419a5557fdSlucy wang - Sun Microsystems - Beijing China (caddr_t)adapter, NULL); 10429a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 10439a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: ddi_intr_add_handler() failure\n", 10449a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 10459a5557fdSlucy wang - Sun Microsystems - Beijing China (void) ddi_intr_free(adapter->intr_handle); 10469a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 10479a5557fdSlucy wang - Sun Microsystems - Beijing China } 10489a5557fdSlucy wang - Sun Microsystems - Beijing China 10499a5557fdSlucy wang - Sun Microsystems - Beijing China /* Add softintr if required */ 10509a5557fdSlucy wang - Sun Microsystems - Beijing China 10519a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 10529a5557fdSlucy wang - Sun Microsystems - Beijing China 10539a5557fdSlucy wang - Sun Microsystems - Beijing China } 10549a5557fdSlucy wang - Sun Microsystems - Beijing China 10559a5557fdSlucy wang - Sun Microsystems - Beijing China void 10569a5557fdSlucy wang - Sun Microsystems - Beijing China unm_destroy_intr(unm_adapter *adapter) 10579a5557fdSlucy wang - Sun Microsystems - Beijing China { 10589a5557fdSlucy wang - Sun Microsystems - Beijing China /* disable interrupt */ 10599a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->intr_type == DDI_INTR_TYPE_MSI) 10609a5557fdSlucy wang - Sun Microsystems - Beijing China (void) ddi_intr_block_disable(&adapter->intr_handle, 1); 10619a5557fdSlucy wang - Sun Microsystems - Beijing China else 10629a5557fdSlucy wang - Sun Microsystems - Beijing China (void) ddi_intr_disable(adapter->intr_handle); 10639a5557fdSlucy wang - Sun Microsystems - Beijing China 10649a5557fdSlucy wang - Sun Microsystems - Beijing China (void) ddi_intr_remove_handler(adapter->intr_handle); 10659a5557fdSlucy wang - Sun Microsystems - Beijing China (void) ddi_intr_free(adapter->intr_handle); 10669a5557fdSlucy wang - Sun Microsystems - Beijing China 10679a5557fdSlucy wang - Sun Microsystems - Beijing China /* Remove the software intr handler */ 10689a5557fdSlucy wang - Sun Microsystems - Beijing China } 10699a5557fdSlucy wang - Sun Microsystems - Beijing China 10709a5557fdSlucy wang - Sun Microsystems - Beijing China static void 10719a5557fdSlucy wang - Sun Microsystems - Beijing China netxen_set_port_mode(unm_adapter *adapter) 10729a5557fdSlucy wang - Sun Microsystems - Beijing China { 10739a5557fdSlucy wang - Sun Microsystems - Beijing China static int wol_port_mode = UNM_PORT_MODE_AUTO_NEG_1G; 10749a5557fdSlucy wang - Sun Microsystems - Beijing China static int port_mode = UNM_PORT_MODE_AUTO_NEG; 10759a5557fdSlucy wang - Sun Microsystems - Beijing China int btype = adapter->ahw.boardcfg.board_type, data = 0; 10769a5557fdSlucy wang - Sun Microsystems - Beijing China 10779a5557fdSlucy wang - Sun Microsystems - Beijing China if (btype == UNM_BRDTYPE_P3_HMEZ || btype == UNM_BRDTYPE_P3_XG_LOM) { 10789a5557fdSlucy wang - Sun Microsystems - Beijing China data = port_mode; /* set to port_mode normally */ 10799a5557fdSlucy wang - Sun Microsystems - Beijing China if ((port_mode != UNM_PORT_MODE_802_3_AP) && 10809a5557fdSlucy wang - Sun Microsystems - Beijing China (port_mode != UNM_PORT_MODE_XG) && 10819a5557fdSlucy wang - Sun Microsystems - Beijing China (port_mode != UNM_PORT_MODE_AUTO_NEG_1G) && 10829a5557fdSlucy wang - Sun Microsystems - Beijing China (port_mode != UNM_PORT_MODE_AUTO_NEG_XG)) 10839a5557fdSlucy wang - Sun Microsystems - Beijing China data = UNM_PORT_MODE_AUTO_NEG; 10849a5557fdSlucy wang - Sun Microsystems - Beijing China 10859a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_PORT_MODE_ADDR, 10869a5557fdSlucy wang - Sun Microsystems - Beijing China &data, 4); 10879a5557fdSlucy wang - Sun Microsystems - Beijing China 10889a5557fdSlucy wang - Sun Microsystems - Beijing China if ((wol_port_mode != UNM_PORT_MODE_802_3_AP) && 10899a5557fdSlucy wang - Sun Microsystems - Beijing China (wol_port_mode != UNM_PORT_MODE_XG) && 10909a5557fdSlucy wang - Sun Microsystems - Beijing China (wol_port_mode != UNM_PORT_MODE_AUTO_NEG_1G) && 10919a5557fdSlucy wang - Sun Microsystems - Beijing China (wol_port_mode != UNM_PORT_MODE_AUTO_NEG_XG)) 10929a5557fdSlucy wang - Sun Microsystems - Beijing China wol_port_mode = UNM_PORT_MODE_AUTO_NEG; 10939a5557fdSlucy wang - Sun Microsystems - Beijing China 10949a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_WOL_PORT_MODE, 10959a5557fdSlucy wang - Sun Microsystems - Beijing China &wol_port_mode, 4); 10969a5557fdSlucy wang - Sun Microsystems - Beijing China } 10979a5557fdSlucy wang - Sun Microsystems - Beijing China } 10989a5557fdSlucy wang - Sun Microsystems - Beijing China 10999a5557fdSlucy wang - Sun Microsystems - Beijing China static void 11009a5557fdSlucy wang - Sun Microsystems - Beijing China netxen_pcie_strap_init(unm_adapter *adapter) 11019a5557fdSlucy wang - Sun Microsystems - Beijing China { 11029a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_acc_handle_t pcihdl = adapter->pci_cfg_handle; 11039a5557fdSlucy wang - Sun Microsystems - Beijing China u32 chicken, control, c8c9value = 0xF1000; 11049a5557fdSlucy wang - Sun Microsystems - Beijing China 11059a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_read_wx(adapter, UNM_PCIE_REG(PCIE_CHICKEN3), 11069a5557fdSlucy wang - Sun Microsystems - Beijing China &chicken, 4); 11079a5557fdSlucy wang - Sun Microsystems - Beijing China 11089a5557fdSlucy wang - Sun Microsystems - Beijing China chicken &= 0xFCFFFFFF; /* clear chicken3 25:24 */ 11099a5557fdSlucy wang - Sun Microsystems - Beijing China control = pci_config_get32(pcihdl, 0xD0); 11109a5557fdSlucy wang - Sun Microsystems - Beijing China if ((control & 0x000F0000) != 0x00020000) /* is it gen1? */ 11119a5557fdSlucy wang - Sun Microsystems - Beijing China chicken |= 0x01000000; 11129a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, UNM_PCIE_REG(PCIE_CHICKEN3), 11139a5557fdSlucy wang - Sun Microsystems - Beijing China &chicken, 4); 11149a5557fdSlucy wang - Sun Microsystems - Beijing China control = pci_config_get32(pcihdl, 0xC8); 11159a5557fdSlucy wang - Sun Microsystems - Beijing China control = pci_config_get32(pcihdl, 0xC8); 11169a5557fdSlucy wang - Sun Microsystems - Beijing China pci_config_put32(pcihdl, 0xC8, c8c9value); 11179a5557fdSlucy wang - Sun Microsystems - Beijing China } 11189a5557fdSlucy wang - Sun Microsystems - Beijing China 11199a5557fdSlucy wang - Sun Microsystems - Beijing China static int 11209a5557fdSlucy wang - Sun Microsystems - Beijing China netxen_read_mac_addr(unm_adapter *adapter) 11219a5557fdSlucy wang - Sun Microsystems - Beijing China { 1122dda0720aSjing xiong ERI-SUN u64 mac_addr[8 + 1]; 11239a5557fdSlucy wang - Sun Microsystems - Beijing China unsigned char *p; 11249a5557fdSlucy wang - Sun Microsystems - Beijing China int i; 11259a5557fdSlucy wang - Sun Microsystems - Beijing China 11269a5557fdSlucy wang - Sun Microsystems - Beijing China if (get_flash_mac_addr(adapter, mac_addr) != 0) 11279a5557fdSlucy wang - Sun Microsystems - Beijing China return (-1); 11289a5557fdSlucy wang - Sun Microsystems - Beijing China 11299a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) 11309a5557fdSlucy wang - Sun Microsystems - Beijing China p = (unsigned char *)&mac_addr[adapter->ahw.pci_func]; 11319a5557fdSlucy wang - Sun Microsystems - Beijing China else 11329a5557fdSlucy wang - Sun Microsystems - Beijing China p = (unsigned char *)&mac_addr[adapter->portnum]; 11339a5557fdSlucy wang - Sun Microsystems - Beijing China 11349a5557fdSlucy wang - Sun Microsystems - Beijing China for (i = 0; i < 6; i++) 11359a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->mac_addr[i] = p[5 - i]; 11369a5557fdSlucy wang - Sun Microsystems - Beijing China 11379a5557fdSlucy wang - Sun Microsystems - Beijing China if (unm_nic_macaddr_set(adapter, adapter->mac_addr) != 0) 11389a5557fdSlucy wang - Sun Microsystems - Beijing China return (-1); 11399a5557fdSlucy wang - Sun Microsystems - Beijing China 11409a5557fdSlucy wang - Sun Microsystems - Beijing China return (0); 11419a5557fdSlucy wang - Sun Microsystems - Beijing China } 11429a5557fdSlucy wang - Sun Microsystems - Beijing China 11439a5557fdSlucy wang - Sun Microsystems - Beijing China static int 11449a5557fdSlucy wang - Sun Microsystems - Beijing China unmattach(dev_info_t *dip, ddi_attach_cmd_t cmd) 11459a5557fdSlucy wang - Sun Microsystems - Beijing China { 11469a5557fdSlucy wang - Sun Microsystems - Beijing China unm_adapter *adapter; 11479a5557fdSlucy wang - Sun Microsystems - Beijing China int i, first_driver = 0; 1148dda0720aSjing xiong ERI-SUN int ret, temp; 11499a5557fdSlucy wang - Sun Microsystems - Beijing China 11509a5557fdSlucy wang - Sun Microsystems - Beijing China switch (cmd) { 11519a5557fdSlucy wang - Sun Microsystems - Beijing China case DDI_ATTACH: 11529a5557fdSlucy wang - Sun Microsystems - Beijing China break; 11539a5557fdSlucy wang - Sun Microsystems - Beijing China case DDI_RESUME: 11549a5557fdSlucy wang - Sun Microsystems - Beijing China case DDI_PM_RESUME: 11559a5557fdSlucy wang - Sun Microsystems - Beijing China default: 11569a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 11579a5557fdSlucy wang - Sun Microsystems - Beijing China } 11589a5557fdSlucy wang - Sun Microsystems - Beijing China 11599a5557fdSlucy wang - Sun Microsystems - Beijing China adapter = kmem_zalloc(sizeof (unm_adapter), KM_SLEEP); 11609a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->dip = dip; 11619a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_set_driver_private(dip, adapter); 11629a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->instance = ddi_get_instance(dip); 11639a5557fdSlucy wang - Sun Microsystems - Beijing China 11649a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name = ddi_driver_name(dip); 11659a5557fdSlucy wang - Sun Microsystems - Beijing China 11669a5557fdSlucy wang - Sun Microsystems - Beijing China ret = pci_config_setup(dip, &adapter->pci_cfg_handle); 11679a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 11689a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: pci_config_setup failed\n", 11699a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 11709a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_setup_err; 11719a5557fdSlucy wang - Sun Microsystems - Beijing China } 11729a5557fdSlucy wang - Sun Microsystems - Beijing China 11739a5557fdSlucy wang - Sun Microsystems - Beijing China ret = unm_pci_cfg_init(adapter); 11749a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) 11759a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_err; 11769a5557fdSlucy wang - Sun Microsystems - Beijing China 11779a5557fdSlucy wang - Sun Microsystems - Beijing China ret = unm_pci_map_setup(adapter); 11789a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) 11799a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_err; 11809a5557fdSlucy wang - Sun Microsystems - Beijing China 11819a5557fdSlucy wang - Sun Microsystems - Beijing China if (unm_initialize_intr(adapter) != DDI_SUCCESS) 11829a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_unmap_regs; 11839a5557fdSlucy wang - Sun Microsystems - Beijing China 11849a5557fdSlucy wang - Sun Microsystems - Beijing China rw_init(&adapter->adapter_lock, NULL, 11859a5557fdSlucy wang - Sun Microsystems - Beijing China RW_DRIVER, DDI_INTR_PRI(adapter->intr_pri)); 11869a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_init(&adapter->tx_lock, NULL, 11879a5557fdSlucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri))); 11889a5557fdSlucy wang - Sun Microsystems - Beijing China mutex_init(&adapter->lock, NULL, 11899a5557fdSlucy wang - Sun Microsystems - Beijing China MUTEX_DRIVER, (DDI_INTR_PRI(adapter->intr_pri))); 11909a5557fdSlucy wang - Sun Microsystems - Beijing China 11919a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->portnum = (int8_t)adapter->ahw.pci_func; 11929a5557fdSlucy wang - Sun Microsystems - Beijing China 11939a5557fdSlucy wang - Sun Microsystems - Beijing China /* 11949a5557fdSlucy wang - Sun Microsystems - Beijing China * Set the CRB window to invalid. If any register in window 0 is 11959a5557fdSlucy wang - Sun Microsystems - Beijing China * accessed it should set window to 0 and then reset it to 1. 11969a5557fdSlucy wang - Sun Microsystems - Beijing China */ 11979a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->curr_window = 255; 11989a5557fdSlucy wang - Sun Microsystems - Beijing China 11999a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->fw_major = adapter->unm_nic_pci_read_normalize(adapter, 12009a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_FW_VERSION_MAJOR); 12019a5557fdSlucy wang - Sun Microsystems - Beijing China 12029a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->fw_major < 4) 12039a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->max_rds_rings = 3; 12049a5557fdSlucy wang - Sun Microsystems - Beijing China else 12059a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->max_rds_rings = 2; 12069a5557fdSlucy wang - Sun Microsystems - Beijing China 12079a5557fdSlucy wang - Sun Microsystems - Beijing China STRUCT_COPY(adapter->gc_dma_attr_desc, unm_dma_attr_desc); 12089a5557fdSlucy wang - Sun Microsystems - Beijing China STRUCT_COPY(adapter->gc_attr_desc, unm_buf_attr); 12099a5557fdSlucy wang - Sun Microsystems - Beijing China 12109a5557fdSlucy wang - Sun Microsystems - Beijing China ret = unm_nic_get_board_info(adapter); 12119a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 12129a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: error reading board config\n", 12139a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 12149a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr; 12159a5557fdSlucy wang - Sun Microsystems - Beijing China } 12169a5557fdSlucy wang - Sun Microsystems - Beijing China 12179a5557fdSlucy wang - Sun Microsystems - Beijing China /* Mezz cards have PCI function 0, 2, 3 enabled */ 12189a5557fdSlucy wang - Sun Microsystems - Beijing China switch (adapter->ahw.boardcfg.board_type) { 12199a5557fdSlucy wang - Sun Microsystems - Beijing China case UNM_BRDTYPE_P2_SB31_10G_IMEZ: 12209a5557fdSlucy wang - Sun Microsystems - Beijing China case UNM_BRDTYPE_P2_SB31_10G_HMEZ: 12219a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->ahw.pci_func >= 2) { 12229a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->portnum = adapter->ahw.pci_func - 2; 12239a5557fdSlucy wang - Sun Microsystems - Beijing China } 12249a5557fdSlucy wang - Sun Microsystems - Beijing China default: 12259a5557fdSlucy wang - Sun Microsystems - Beijing China break; 12269a5557fdSlucy wang - Sun Microsystems - Beijing China } 12279a5557fdSlucy wang - Sun Microsystems - Beijing China 12289a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { 12299a5557fdSlucy wang - Sun Microsystems - Beijing China temp = UNM_CRB_READ_VAL_ADAPTER(UNM_MIU_MN_CONTROL, adapter); 12309a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.cut_through = NX_IS_SYSTEM_CUT_THROUGH(temp); 12319a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->ahw.pci_func == 0) 12329a5557fdSlucy wang - Sun Microsystems - Beijing China first_driver = 1; 12339a5557fdSlucy wang - Sun Microsystems - Beijing China } else { 12349a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->portnum == 0) 12359a5557fdSlucy wang - Sun Microsystems - Beijing China first_driver = 1; 12369a5557fdSlucy wang - Sun Microsystems - Beijing China } 12379a5557fdSlucy wang - Sun Microsystems - Beijing China 12389a5557fdSlucy wang - Sun Microsystems - Beijing China unm_check_options(adapter); 12399a5557fdSlucy wang - Sun Microsystems - Beijing China 12409a5557fdSlucy wang - Sun Microsystems - Beijing China if (first_driver) { 12419a5557fdSlucy wang - Sun Microsystems - Beijing China int first_boot = adapter->unm_nic_pci_read_normalize(adapter, 12429a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_CAM_RAM(0x1fc)); 12439a5557fdSlucy wang - Sun Microsystems - Beijing China 12449a5557fdSlucy wang - Sun Microsystems - Beijing China if (check_hw_init(adapter) != 0) { 12459a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Error in HW init sequence\n", 12469a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 12479a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr; 12489a5557fdSlucy wang - Sun Microsystems - Beijing China } 12499a5557fdSlucy wang - Sun Microsystems - Beijing China 12509a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) 12519a5557fdSlucy wang - Sun Microsystems - Beijing China netxen_set_port_mode(adapter); 12529a5557fdSlucy wang - Sun Microsystems - Beijing China 12539a5557fdSlucy wang - Sun Microsystems - Beijing China if (first_boot != 0x55555555) { 12549a5557fdSlucy wang - Sun Microsystems - Beijing China temp = 0; 12559a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_CMDPEG_STATE, 12569a5557fdSlucy wang - Sun Microsystems - Beijing China &temp, 4); 12579a5557fdSlucy wang - Sun Microsystems - Beijing China if (pinit_from_rom(adapter, 0) != 0) 12589a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr; 12599a5557fdSlucy wang - Sun Microsystems - Beijing China 12609a5557fdSlucy wang - Sun Microsystems - Beijing China drv_usecwait(500); 12619a5557fdSlucy wang - Sun Microsystems - Beijing China 12629a5557fdSlucy wang - Sun Microsystems - Beijing China ret = load_from_flash(adapter); 12639a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) 12649a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr; 12659a5557fdSlucy wang - Sun Microsystems - Beijing China } 12669a5557fdSlucy wang - Sun Microsystems - Beijing China 12679a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret = unm_initialize_dummy_dma(adapter)) 12689a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr; 12699a5557fdSlucy wang - Sun Microsystems - Beijing China 12709a5557fdSlucy wang - Sun Microsystems - Beijing China /* 12719a5557fdSlucy wang - Sun Microsystems - Beijing China * Tell the hardware our version number. 12729a5557fdSlucy wang - Sun Microsystems - Beijing China */ 12739a5557fdSlucy wang - Sun Microsystems - Beijing China i = (_UNM_NIC_MAJOR << 16) | 12749a5557fdSlucy wang - Sun Microsystems - Beijing China ((_UNM_NIC_MINOR << 8)) | (_UNM_NIC_SUBVERSION); 12759a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_hw_write_wx(adapter, CRB_DRIVER_VERSION, 12769a5557fdSlucy wang - Sun Microsystems - Beijing China &i, 4); 12779a5557fdSlucy wang - Sun Microsystems - Beijing China 12789a5557fdSlucy wang - Sun Microsystems - Beijing China /* Unlock the HW, prompting the boot sequence */ 12799a5557fdSlucy wang - Sun Microsystems - Beijing China if ((first_boot == 0x55555555) && 12809a5557fdSlucy wang - Sun Microsystems - Beijing China (NX_IS_REVISION_P2(adapter->ahw.revision_id))) 12819a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->unm_nic_pci_write_normalize(adapter, 12829a5557fdSlucy wang - Sun Microsystems - Beijing China UNM_ROMUSB_GLB_PEGTUNE_DONE, 1); 12839a5557fdSlucy wang - Sun Microsystems - Beijing China 12849a5557fdSlucy wang - Sun Microsystems - Beijing China /* Handshake with the card before we register the devices. */ 12859a5557fdSlucy wang - Sun Microsystems - Beijing China if (phantom_init(adapter, 0) != DDI_SUCCESS) 12869a5557fdSlucy wang - Sun Microsystems - Beijing China goto attach_destroy_intr; 12879a5557fdSlucy wang - Sun Microsystems - Beijing China } 12889a5557fdSlucy wang - Sun Microsystems - Beijing China 12899a5557fdSlucy wang - Sun Microsystems - Beijing China if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) 12909a5557fdSlucy wang - Sun Microsystems - Beijing China netxen_pcie_strap_init(adapter); 12919a5557fdSlucy wang - Sun Microsystems - Beijing China 12929a5557fdSlucy wang - Sun Microsystems - Beijing China /* 12939a5557fdSlucy wang - Sun Microsystems - Beijing China * See if the firmware gave us a virtual-physical port mapping. 12949a5557fdSlucy wang - Sun Microsystems - Beijing China */ 12959a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->physical_port = adapter->portnum; 12969a5557fdSlucy wang - Sun Microsystems - Beijing China i = adapter->unm_nic_pci_read_normalize(adapter, 12979a5557fdSlucy wang - Sun Microsystems - Beijing China CRB_V2P(adapter->portnum)); 12989a5557fdSlucy wang - Sun Microsystems - Beijing China if (i != 0x55555555) 12999a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->physical_port = (uint16_t)i; 13009a5557fdSlucy wang - Sun Microsystems - Beijing China 13019a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->ahw.linkup = 0; 13029a5557fdSlucy wang - Sun Microsystems - Beijing China 13039a5557fdSlucy wang - Sun Microsystems - Beijing China if (receive_peg_ready(adapter)) { 13049a5557fdSlucy wang - Sun Microsystems - Beijing China ret = -EIO; 1305dda0720aSjing xiong ERI-SUN goto free_dummy_dma; 13069a5557fdSlucy wang - Sun Microsystems - Beijing China } 13079a5557fdSlucy wang - Sun Microsystems - Beijing China 13089a5557fdSlucy wang - Sun Microsystems - Beijing China if (netxen_read_mac_addr(adapter)) 13099a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s%d: Failed to read MAC addr\n", 13109a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 13119a5557fdSlucy wang - Sun Microsystems - Beijing China 13129a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_flash_print(adapter); 13139a5557fdSlucy wang - Sun Microsystems - Beijing China 13149a5557fdSlucy wang - Sun Microsystems - Beijing China if (verbmsg != 0) { 13159a5557fdSlucy wang - Sun Microsystems - Beijing China switch (adapter->ahw.board_type) { 13169a5557fdSlucy wang - Sun Microsystems - Beijing China case UNM_NIC_GBE: 13179a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_NOTE, "%s: QUAD GbE port %d initialized\n", 13189a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_driver_name, adapter->portnum); 13199a5557fdSlucy wang - Sun Microsystems - Beijing China break; 13209a5557fdSlucy wang - Sun Microsystems - Beijing China 13219a5557fdSlucy wang - Sun Microsystems - Beijing China case UNM_NIC_XGBE: 13229a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_NOTE, "%s: XGbE port %d initialized\n", 13239a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_driver_name, adapter->portnum); 13249a5557fdSlucy wang - Sun Microsystems - Beijing China break; 13259a5557fdSlucy wang - Sun Microsystems - Beijing China } 13269a5557fdSlucy wang - Sun Microsystems - Beijing China } 13279a5557fdSlucy wang - Sun Microsystems - Beijing China 13289a5557fdSlucy wang - Sun Microsystems - Beijing China ret = unm_register_mac(adapter); 13299a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 13309a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_NOTE, "%s%d: Mac registration error\n", 13319a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->name, adapter->instance); 1332dda0720aSjing xiong ERI-SUN goto free_dummy_dma; 13339a5557fdSlucy wang - Sun Microsystems - Beijing China } 13349a5557fdSlucy wang - Sun Microsystems - Beijing China 13359a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 13369a5557fdSlucy wang - Sun Microsystems - Beijing China 1337dda0720aSjing xiong ERI-SUN free_dummy_dma: 1338dda0720aSjing xiong ERI-SUN if (first_driver) 13399a5557fdSlucy wang - Sun Microsystems - Beijing China unm_free_dummy_dma(adapter); 13409a5557fdSlucy wang - Sun Microsystems - Beijing China attach_destroy_intr: 13419a5557fdSlucy wang - Sun Microsystems - Beijing China unm_destroy_intr(adapter); 13429a5557fdSlucy wang - Sun Microsystems - Beijing China attach_unmap_regs: 13439a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&(adapter->regs_handle)); 13449a5557fdSlucy wang - Sun Microsystems - Beijing China ddi_regs_map_free(&(adapter->db_handle)); 13459a5557fdSlucy wang - Sun Microsystems - Beijing China attach_err: 13469a5557fdSlucy wang - Sun Microsystems - Beijing China pci_config_teardown(&adapter->pci_cfg_handle); 13479a5557fdSlucy wang - Sun Microsystems - Beijing China attach_setup_err: 13489a5557fdSlucy wang - Sun Microsystems - Beijing China kmem_free(adapter, sizeof (unm_adapter)); 13499a5557fdSlucy wang - Sun Microsystems - Beijing China return (ret); 13509a5557fdSlucy wang - Sun Microsystems - Beijing China } 13519a5557fdSlucy wang - Sun Microsystems - Beijing China 13529a5557fdSlucy wang - Sun Microsystems - Beijing China static int 13539a5557fdSlucy wang - Sun Microsystems - Beijing China unmdetach(dev_info_t *dip, ddi_detach_cmd_t cmd) 13549a5557fdSlucy wang - Sun Microsystems - Beijing China { 13559a5557fdSlucy wang - Sun Microsystems - Beijing China unm_adapter *adapter = (unm_adapter *)ddi_get_driver_private(dip); 13569a5557fdSlucy wang - Sun Microsystems - Beijing China 13579a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter == NULL) 13589a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 13599a5557fdSlucy wang - Sun Microsystems - Beijing China 13609a5557fdSlucy wang - Sun Microsystems - Beijing China switch (cmd) { 13619a5557fdSlucy wang - Sun Microsystems - Beijing China case DDI_DETACH: 13629a5557fdSlucy wang - Sun Microsystems - Beijing China unm_fini_kstats(adapter); 13639a5557fdSlucy wang - Sun Microsystems - Beijing China adapter->kstats[0] = NULL; 13649a5557fdSlucy wang - Sun Microsystems - Beijing China 13659a5557fdSlucy wang - Sun Microsystems - Beijing China if (adapter->pci_cfg_handle != NULL) 13669a5557fdSlucy wang - Sun Microsystems - Beijing China pci_config_teardown(&adapter->pci_cfg_handle); 13679a5557fdSlucy wang - Sun Microsystems - Beijing China 13689a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nd_cleanup(adapter); 13699a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_remove(adapter); 13709a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_SUCCESS); 13719a5557fdSlucy wang - Sun Microsystems - Beijing China 13729a5557fdSlucy wang - Sun Microsystems - Beijing China case DDI_SUSPEND: 13739a5557fdSlucy wang - Sun Microsystems - Beijing China return (unm_nic_suspend(adapter)); 13749a5557fdSlucy wang - Sun Microsystems - Beijing China 13759a5557fdSlucy wang - Sun Microsystems - Beijing China default: 13769a5557fdSlucy wang - Sun Microsystems - Beijing China break; 13779a5557fdSlucy wang - Sun Microsystems - Beijing China } 13789a5557fdSlucy wang - Sun Microsystems - Beijing China 13799a5557fdSlucy wang - Sun Microsystems - Beijing China return (DDI_FAILURE); 13809a5557fdSlucy wang - Sun Microsystems - Beijing China } 13819a5557fdSlucy wang - Sun Microsystems - Beijing China 1382dda0720aSjing xiong ERI-SUN int 1383dda0720aSjing xiong ERI-SUN create_rxtx_rings(unm_adapter *adapter) 1384dda0720aSjing xiong ERI-SUN { 1385dda0720aSjing xiong ERI-SUN unm_recv_context_t *recv_ctx; 1386dda0720aSjing xiong ERI-SUN unm_rcv_desc_ctx_t *rcv_desc; 1387dda0720aSjing xiong ERI-SUN int i, ring; 1388dda0720aSjing xiong ERI-SUN 1389dda0720aSjing xiong ERI-SUN adapter->cmd_buf_arr = (struct unm_cmd_buffer *)kmem_zalloc( 1390dda0720aSjing xiong ERI-SUN sizeof (struct unm_cmd_buffer) * adapter->MaxTxDescCount, 1391dda0720aSjing xiong ERI-SUN KM_SLEEP); 1392dda0720aSjing xiong ERI-SUN 1393dda0720aSjing xiong ERI-SUN for (i = 0; i < MAX_RCV_CTX; ++i) { 1394dda0720aSjing xiong ERI-SUN recv_ctx = &adapter->recv_ctx[i]; 1395dda0720aSjing xiong ERI-SUN 1396dda0720aSjing xiong ERI-SUN for (ring = 0; ring < adapter->max_rds_rings; ring++) { 1397dda0720aSjing xiong ERI-SUN rcv_desc = &recv_ctx->rcv_desc[ring]; 1398dda0720aSjing xiong ERI-SUN if (unm_create_rx_ring(adapter, rcv_desc) != 1399dda0720aSjing xiong ERI-SUN DDI_SUCCESS) 1400dda0720aSjing xiong ERI-SUN goto attach_free_cmdbufs; 1401dda0720aSjing xiong ERI-SUN } 1402dda0720aSjing xiong ERI-SUN } 1403dda0720aSjing xiong ERI-SUN 1404dda0720aSjing xiong ERI-SUN if (unm_alloc_tx_dmahdl(adapter) != DDI_SUCCESS) 1405dda0720aSjing xiong ERI-SUN goto attach_free_cmdbufs; 1406dda0720aSjing xiong ERI-SUN 1407dda0720aSjing xiong ERI-SUN if (unm_alloc_tx_buffers(adapter) != DDI_SUCCESS) 1408dda0720aSjing xiong ERI-SUN goto attach_free_tx_dmahdl; 1409dda0720aSjing xiong ERI-SUN 1410dda0720aSjing xiong ERI-SUN return (DDI_SUCCESS); 1411dda0720aSjing xiong ERI-SUN 1412dda0720aSjing xiong ERI-SUN attach_free_tx_buffers: 1413dda0720aSjing xiong ERI-SUN unm_free_tx_buffers(adapter); 1414dda0720aSjing xiong ERI-SUN attach_free_tx_dmahdl: 1415dda0720aSjing xiong ERI-SUN unm_free_tx_dmahdl(adapter); 1416dda0720aSjing xiong ERI-SUN attach_free_cmdbufs: 1417dda0720aSjing xiong ERI-SUN kmem_free(adapter->cmd_buf_arr, sizeof (struct unm_cmd_buffer) * 1418dda0720aSjing xiong ERI-SUN adapter->MaxTxDescCount); 1419dda0720aSjing xiong ERI-SUN for (i = 0; i < MAX_RCV_CTX; ++i) { 1420dda0720aSjing xiong ERI-SUN recv_ctx = &adapter->recv_ctx[i]; 1421dda0720aSjing xiong ERI-SUN 1422dda0720aSjing xiong ERI-SUN for (ring = 0; ring < adapter->max_rds_rings; ring++) { 1423dda0720aSjing xiong ERI-SUN rcv_desc = &recv_ctx->rcv_desc[ring]; 1424dda0720aSjing xiong ERI-SUN if (rcv_desc->rx_buf_pool != NULL) 1425dda0720aSjing xiong ERI-SUN unm_destroy_rx_ring(rcv_desc); 1426dda0720aSjing xiong ERI-SUN } 1427dda0720aSjing xiong ERI-SUN } 1428dda0720aSjing xiong ERI-SUN return (DDI_FAILURE); 1429dda0720aSjing xiong ERI-SUN } 1430dda0720aSjing xiong ERI-SUN 1431dda0720aSjing xiong ERI-SUN void 1432dda0720aSjing xiong ERI-SUN destroy_rxtx_rings(unm_adapter *adapter) 1433dda0720aSjing xiong ERI-SUN { 1434dda0720aSjing xiong ERI-SUN unm_recv_context_t *recv_ctx; 1435dda0720aSjing xiong ERI-SUN unm_rcv_desc_ctx_t *rcv_desc; 1436dda0720aSjing xiong ERI-SUN int ctx, ring; 1437dda0720aSjing xiong ERI-SUN 1438dda0720aSjing xiong ERI-SUN unm_free_tx_buffers(adapter); 1439dda0720aSjing xiong ERI-SUN unm_free_tx_dmahdl(adapter); 1440dda0720aSjing xiong ERI-SUN 1441dda0720aSjing xiong ERI-SUN for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) { 1442dda0720aSjing xiong ERI-SUN recv_ctx = &adapter->recv_ctx[ctx]; 1443dda0720aSjing xiong ERI-SUN for (ring = 0; ring < adapter->max_rds_rings; ring++) { 1444dda0720aSjing xiong ERI-SUN rcv_desc = &recv_ctx->rcv_desc[ring]; 1445dda0720aSjing xiong ERI-SUN if (rcv_desc->rx_buf_pool != NULL) 1446dda0720aSjing xiong ERI-SUN unm_destroy_rx_ring(rcv_desc); 1447dda0720aSjing xiong ERI-SUN } 1448dda0720aSjing xiong ERI-SUN } 1449dda0720aSjing xiong ERI-SUN 1450dda0720aSjing xiong ERI-SUN if (adapter->cmd_buf_arr != NULL) 1451dda0720aSjing xiong ERI-SUN kmem_free(adapter->cmd_buf_arr, 1452dda0720aSjing xiong ERI-SUN sizeof (struct unm_cmd_buffer) * adapter->MaxTxDescCount); 1453dda0720aSjing xiong ERI-SUN } 1454dda0720aSjing xiong ERI-SUN 14559a5557fdSlucy wang - Sun Microsystems - Beijing China #ifdef SOLARIS11 14569a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DEFINE_STREAM_OPS(unm_ops, nulldev, nulldev, unmattach, unmdetach, 14579a5557fdSlucy wang - Sun Microsystems - Beijing China nodev, NULL, D_MP, NULL, NULL); 14589a5557fdSlucy wang - Sun Microsystems - Beijing China #else 14599a5557fdSlucy wang - Sun Microsystems - Beijing China DDI_DEFINE_STREAM_OPS(unm_ops, nulldev, nulldev, unmattach, unmdetach, 14609a5557fdSlucy wang - Sun Microsystems - Beijing China nodev, NULL, D_MP, NULL); 14619a5557fdSlucy wang - Sun Microsystems - Beijing China #endif 14629a5557fdSlucy wang - Sun Microsystems - Beijing China 14639a5557fdSlucy wang - Sun Microsystems - Beijing China static struct modldrv modldrv = { 14649a5557fdSlucy wang - Sun Microsystems - Beijing China &mod_driverops, /* Type of module. This one is a driver */ 14659a5557fdSlucy wang - Sun Microsystems - Beijing China ident, 14669a5557fdSlucy wang - Sun Microsystems - Beijing China &unm_ops, /* driver ops */ 14679a5557fdSlucy wang - Sun Microsystems - Beijing China }; 14689a5557fdSlucy wang - Sun Microsystems - Beijing China 14699a5557fdSlucy wang - Sun Microsystems - Beijing China static struct modlinkage modlinkage = { 14709a5557fdSlucy wang - Sun Microsystems - Beijing China MODREV_1, 14719a5557fdSlucy wang - Sun Microsystems - Beijing China (&modldrv), 14729a5557fdSlucy wang - Sun Microsystems - Beijing China NULL 14739a5557fdSlucy wang - Sun Microsystems - Beijing China }; 14749a5557fdSlucy wang - Sun Microsystems - Beijing China 14759a5557fdSlucy wang - Sun Microsystems - Beijing China 14769a5557fdSlucy wang - Sun Microsystems - Beijing China int 14779a5557fdSlucy wang - Sun Microsystems - Beijing China _init(void) 14789a5557fdSlucy wang - Sun Microsystems - Beijing China { 14799a5557fdSlucy wang - Sun Microsystems - Beijing China int ret; 14809a5557fdSlucy wang - Sun Microsystems - Beijing China 14819a5557fdSlucy wang - Sun Microsystems - Beijing China unm_ops.devo_cb_ops->cb_str = NULL; 14829a5557fdSlucy wang - Sun Microsystems - Beijing China mac_init_ops(&unm_ops, "ntxn"); 14839a5557fdSlucy wang - Sun Microsystems - Beijing China 14849a5557fdSlucy wang - Sun Microsystems - Beijing China ret = mod_install(&modlinkage); 14859a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret != DDI_SUCCESS) { 14869a5557fdSlucy wang - Sun Microsystems - Beijing China mac_fini_ops(&unm_ops); 14879a5557fdSlucy wang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ntxn: mod_install failed\n"); 14889a5557fdSlucy wang - Sun Microsystems - Beijing China } 14899a5557fdSlucy wang - Sun Microsystems - Beijing China 14909a5557fdSlucy wang - Sun Microsystems - Beijing China return (ret); 14919a5557fdSlucy wang - Sun Microsystems - Beijing China } 14929a5557fdSlucy wang - Sun Microsystems - Beijing China 14939a5557fdSlucy wang - Sun Microsystems - Beijing China 14949a5557fdSlucy wang - Sun Microsystems - Beijing China int 14959a5557fdSlucy wang - Sun Microsystems - Beijing China _fini(void) 14969a5557fdSlucy wang - Sun Microsystems - Beijing China { 14979a5557fdSlucy wang - Sun Microsystems - Beijing China int ret; 14989a5557fdSlucy wang - Sun Microsystems - Beijing China 14999a5557fdSlucy wang - Sun Microsystems - Beijing China ret = mod_remove(&modlinkage); 15009a5557fdSlucy wang - Sun Microsystems - Beijing China if (ret == DDI_SUCCESS) 15019a5557fdSlucy wang - Sun Microsystems - Beijing China mac_fini_ops(&unm_ops); 15029a5557fdSlucy wang - Sun Microsystems - Beijing China return (ret); 15039a5557fdSlucy wang - Sun Microsystems - Beijing China } 15049a5557fdSlucy wang - Sun Microsystems - Beijing China 15059a5557fdSlucy wang - Sun Microsystems - Beijing China int 15069a5557fdSlucy wang - Sun Microsystems - Beijing China _info(struct modinfo *modinfop) 15079a5557fdSlucy wang - Sun Microsystems - Beijing China { 15089a5557fdSlucy wang - Sun Microsystems - Beijing China return (mod_info(&modlinkage, modinfop)); 15099a5557fdSlucy wang - Sun Microsystems - Beijing China } 1510