bge_main2.c (8398201f) | bge_main2.c (f724721b) |
---|---|
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 12 unchanged lines hidden (view full) --- 21 22/* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#pragma ident "%Z%%M% %I% %E% SMI" 28 | 1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 12 unchanged lines hidden (view full) --- 21 22/* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#pragma ident "%Z%%M% %I% %E% SMI" 28 |
29#include "sys/bge_impl2.h" | 29#include "bge_impl.h" |
30#include <sys/sdt.h> 31 32/* 33 * This is the string displayed by modinfo, etc. 34 * Make sure you keep the version ID up to date! 35 */ 36static char bge_ident[] = "Broadcom Gb Ethernet v0.52"; 37 --- 1085 unchanged lines hidden (view full) --- 1123 default: 1124 miocnak(wq, mp, 0, EINVAL); 1125 return; 1126 1127 case BGE_MII_READ: 1128 case BGE_MII_WRITE: 1129 case BGE_SEE_READ: 1130 case BGE_SEE_WRITE: | 30#include <sys/sdt.h> 31 32/* 33 * This is the string displayed by modinfo, etc. 34 * Make sure you keep the version ID up to date! 35 */ 36static char bge_ident[] = "Broadcom Gb Ethernet v0.52"; 37 --- 1085 unchanged lines hidden (view full) --- 1123 default: 1124 miocnak(wq, mp, 0, EINVAL); 1125 return; 1126 1127 case BGE_MII_READ: 1128 case BGE_MII_WRITE: 1129 case BGE_SEE_READ: 1130 case BGE_SEE_WRITE: |
1131 case BGE_FLASH_READ: 1132 case BGE_FLASH_WRITE: |
|
1131 case BGE_DIAG: 1132 case BGE_PEEK: 1133 case BGE_POKE: 1134 case BGE_PHY_RESET: 1135 case BGE_SOFT_RESET: 1136 case BGE_HARD_RESET: 1137 break; 1138 --- 40 unchanged lines hidden (view full) --- 1179 _NOTE(NOTREACHED) 1180 status = IOC_INVAL; 1181 break; 1182 1183 case BGE_MII_READ: 1184 case BGE_MII_WRITE: 1185 case BGE_SEE_READ: 1186 case BGE_SEE_WRITE: | 1133 case BGE_DIAG: 1134 case BGE_PEEK: 1135 case BGE_POKE: 1136 case BGE_PHY_RESET: 1137 case BGE_SOFT_RESET: 1138 case BGE_HARD_RESET: 1139 break; 1140 --- 40 unchanged lines hidden (view full) --- 1181 _NOTE(NOTREACHED) 1182 status = IOC_INVAL; 1183 break; 1184 1185 case BGE_MII_READ: 1186 case BGE_MII_WRITE: 1187 case BGE_SEE_READ: 1188 case BGE_SEE_WRITE: |
1189 case BGE_FLASH_READ: 1190 case BGE_FLASH_WRITE: |
|
1187 case BGE_DIAG: 1188 case BGE_PEEK: 1189 case BGE_POKE: 1190 case BGE_PHY_RESET: 1191 case BGE_SOFT_RESET: 1192 case BGE_HARD_RESET: 1193 status = bge_chip_ioctl(bgep, wq, mp, iocp); 1194 break; --- 22 unchanged lines hidden (view full) --- 1217 case IOC_RESTART_REPLY: 1218 case IOC_RESTART_ACK: 1219 if (bge_phys_update(bgep) != DDI_SUCCESS) { 1220 ddi_fm_service_impact(bgep->devinfo, 1221 DDI_SERVICE_DEGRADED); 1222 status = IOC_INVAL; 1223 } 1224#ifdef BGE_IPMI_ASF | 1191 case BGE_DIAG: 1192 case BGE_PEEK: 1193 case BGE_POKE: 1194 case BGE_PHY_RESET: 1195 case BGE_SOFT_RESET: 1196 case BGE_HARD_RESET: 1197 status = bge_chip_ioctl(bgep, wq, mp, iocp); 1198 break; --- 22 unchanged lines hidden (view full) --- 1221 case IOC_RESTART_REPLY: 1222 case IOC_RESTART_ACK: 1223 if (bge_phys_update(bgep) != DDI_SUCCESS) { 1224 ddi_fm_service_impact(bgep->devinfo, 1225 DDI_SERVICE_DEGRADED); 1226 status = IOC_INVAL; 1227 } 1228#ifdef BGE_IPMI_ASF |
1225 if (bge_chip_sync(bgep, B_FALSE) == DDI_FAILURE) { | 1229 if (bge_chip_sync(bgep, B_TRUE) == DDI_FAILURE) { |
1226#else 1227 if (bge_chip_sync(bgep) == DDI_FAILURE) { 1228#endif 1229 ddi_fm_service_impact(bgep->devinfo, 1230 DDI_SERVICE_DEGRADED); 1231 status = IOC_INVAL; 1232 } 1233 if (bgep->intr_type == DDI_INTR_TYPE_MSI) --- 1262 unchanged lines hidden (view full) --- 2496 2497 /* Get supported interrupt types */ 2498 if (ddi_intr_get_supported_types(devinfo, &intr_types) != DDI_SUCCESS) { 2499 bge_error(bgep, "ddi_intr_get_supported_types failed\n"); 2500 2501 goto attach_fail; 2502 } 2503 | 1230#else 1231 if (bge_chip_sync(bgep) == DDI_FAILURE) { 1232#endif 1233 ddi_fm_service_impact(bgep->devinfo, 1234 DDI_SERVICE_DEGRADED); 1235 status = IOC_INVAL; 1236 } 1237 if (bgep->intr_type == DDI_INTR_TYPE_MSI) --- 1262 unchanged lines hidden (view full) --- 2500 2501 /* Get supported interrupt types */ 2502 if (ddi_intr_get_supported_types(devinfo, &intr_types) != DDI_SUCCESS) { 2503 bge_error(bgep, "ddi_intr_get_supported_types failed\n"); 2504 2505 goto attach_fail; 2506 } 2507 |
2504 bge_log(bgep, "ddi_intr_get_supported_types() returned: %x", 2505 intr_types); | 2508 BGE_DEBUG(("%s: ddi_intr_get_supported_types() returned: %x", 2509 bgep->ifname, intr_types)); |
2506 2507 if ((intr_types & DDI_INTR_TYPE_MSI) && bgep->chipid.msi_enabled) { 2508 if (bge_add_intrs(bgep, DDI_INTR_TYPE_MSI) != DDI_SUCCESS) { 2509 bge_error(bgep, "MSI registration failed, " 2510 "trying FIXED interrupt type\n"); 2511 } else { | 2510 2511 if ((intr_types & DDI_INTR_TYPE_MSI) && bgep->chipid.msi_enabled) { 2512 if (bge_add_intrs(bgep, DDI_INTR_TYPE_MSI) != DDI_SUCCESS) { 2513 bge_error(bgep, "MSI registration failed, " 2514 "trying FIXED interrupt type\n"); 2515 } else { |
2512 bge_log(bgep, "Using MSI interrupt type\n"); 2513 | 2516 BGE_DEBUG(("%s: Using MSI interrupt type", 2517 bgep->ifname)); |
2514 bgep->intr_type = DDI_INTR_TYPE_MSI; 2515 bgep->progress |= PROGRESS_HWINT; 2516 } 2517 } 2518 2519 if (!(bgep->progress & PROGRESS_HWINT) && 2520 (intr_types & DDI_INTR_TYPE_FIXED)) { 2521 if (bge_add_intrs(bgep, DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) { 2522 bge_error(bgep, "FIXED interrupt " 2523 "registration failed\n"); 2524 goto attach_fail; 2525 } 2526 | 2518 bgep->intr_type = DDI_INTR_TYPE_MSI; 2519 bgep->progress |= PROGRESS_HWINT; 2520 } 2521 } 2522 2523 if (!(bgep->progress & PROGRESS_HWINT) && 2524 (intr_types & DDI_INTR_TYPE_FIXED)) { 2525 if (bge_add_intrs(bgep, DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) { 2526 bge_error(bgep, "FIXED interrupt " 2527 "registration failed\n"); 2528 goto attach_fail; 2529 } 2530 |
2527 bge_log(bgep, "Using FIXED interrupt type\n"); | 2531 BGE_DEBUG(("%s: Using FIXED interrupt type", bgep->ifname)); |
2528 2529 bgep->intr_type = DDI_INTR_TYPE_FIXED; 2530 bgep->progress |= PROGRESS_HWINT; 2531 } 2532 2533 if (!(bgep->progress & PROGRESS_HWINT)) { 2534 bge_error(bgep, "No interrupts registered\n"); 2535 goto attach_fail; --- 42 unchanged lines hidden (view full) --- 2578#endif 2579 (void) bge_check_acc_handle(bgep, bgep->cfg_handle); 2580 (void) bge_check_acc_handle(bgep, bgep->io_handle); 2581 ddi_fm_service_impact(bgep->devinfo, DDI_SERVICE_LOST); 2582 mutex_exit(bgep->genlock); 2583 goto attach_fail; 2584 } 2585 | 2532 2533 bgep->intr_type = DDI_INTR_TYPE_FIXED; 2534 bgep->progress |= PROGRESS_HWINT; 2535 } 2536 2537 if (!(bgep->progress & PROGRESS_HWINT)) { 2538 bge_error(bgep, "No interrupts registered\n"); 2539 goto attach_fail; --- 42 unchanged lines hidden (view full) --- 2582#endif 2583 (void) bge_check_acc_handle(bgep, bgep->cfg_handle); 2584 (void) bge_check_acc_handle(bgep, bgep->io_handle); 2585 ddi_fm_service_impact(bgep->devinfo, DDI_SERVICE_LOST); 2586 mutex_exit(bgep->genlock); 2587 goto attach_fail; 2588 } 2589 |
2590#ifdef BGE_IPMI_ASF 2591 if (bgep->asf_enabled) { 2592 bgep->asf_status = ASF_STAT_RUN_INIT; 2593 } 2594#endif 2595 |
|
2586 bzero(bgep->mcast_hash, sizeof (bgep->mcast_hash)); 2587 bzero(bgep->mcast_refs, sizeof (bgep->mcast_refs)); 2588 bgep->promisc = B_FALSE; 2589 bgep->param_loop_mode = BGE_LOOP_NONE; 2590 if (bge_check_acc_handle(bgep, bgep->cfg_handle) != DDI_FM_OK) { 2591 ddi_fm_service_impact(bgep->devinfo, DDI_SERVICE_LOST); 2592 mutex_exit(bgep->genlock); 2593 goto attach_fail; --- 70 unchanged lines hidden (view full) --- 2664 mutex_exit(&cpu_lock); 2665 2666 bgep->progress |= PROGRESS_READY; 2667 ASSERT(bgep->bge_guard == BGE_GUARD); 2668 return (DDI_SUCCESS); 2669 2670attach_fail: 2671#ifdef BGE_IPMI_ASF | 2596 bzero(bgep->mcast_hash, sizeof (bgep->mcast_hash)); 2597 bzero(bgep->mcast_refs, sizeof (bgep->mcast_refs)); 2598 bgep->promisc = B_FALSE; 2599 bgep->param_loop_mode = BGE_LOOP_NONE; 2600 if (bge_check_acc_handle(bgep, bgep->cfg_handle) != DDI_FM_OK) { 2601 ddi_fm_service_impact(bgep->devinfo, DDI_SERVICE_LOST); 2602 mutex_exit(bgep->genlock); 2603 goto attach_fail; --- 70 unchanged lines hidden (view full) --- 2674 mutex_exit(&cpu_lock); 2675 2676 bgep->progress |= PROGRESS_READY; 2677 ASSERT(bgep->bge_guard == BGE_GUARD); 2678 return (DDI_SUCCESS); 2679 2680attach_fail: 2681#ifdef BGE_IPMI_ASF |
2672 bge_unattach(bgep, ASF_MODE_NONE); | 2682 bge_unattach(bgep, ASF_MODE_SHUTDOWN); |
2673#else 2674 bge_unattach(bgep); 2675#endif 2676 return (DDI_FAILURE); 2677} 2678 2679/* 2680 * bge_suspend() -- suspend transmit/receive for powerdown --- 53 unchanged lines hidden (view full) --- 2734 return (bge_suspend(bgep)); 2735 2736 case DDI_DETACH: 2737 break; 2738 } 2739 2740#ifdef BGE_IPMI_ASF 2741 mutex_enter(bgep->genlock); | 2683#else 2684 bge_unattach(bgep); 2685#endif 2686 return (DDI_FAILURE); 2687} 2688 2689/* 2690 * bge_suspend() -- suspend transmit/receive for powerdown --- 53 unchanged lines hidden (view full) --- 2744 return (bge_suspend(bgep)); 2745 2746 case DDI_DETACH: 2747 break; 2748 } 2749 2750#ifdef BGE_IPMI_ASF 2751 mutex_enter(bgep->genlock); |
2742 if (bgep->asf_enabled && (bgep->asf_status == ASF_STAT_RUN)) { | 2752 if (bgep->asf_enabled && ((bgep->asf_status == ASF_STAT_RUN) || 2753 (bgep->asf_status == ASF_STAT_RUN_INIT))) { |
2743 2744 bge_asf_update_status(bgep); | 2754 2755 bge_asf_update_status(bgep); |
2745 bge_asf_stop_timer(bgep); | 2756 if (bgep->asf_status == ASF_STAT_RUN) { 2757 bge_asf_stop_timer(bgep); 2758 } |
2746 bgep->asf_status = ASF_STAT_STOP; 2747 2748 bge_asf_pre_reset_operations(bgep, BGE_SHUTDOWN_RESET); 2749 2750 if (bgep->asf_pseudostop) { 2751 bgep->link_up_msg = bgep->link_down_msg = " (stopped)"; 2752 bge_chip_stop(bgep, B_FALSE); 2753 bgep->bge_mac_state = BGE_MAC_STOPPED; --- 95 unchanged lines hidden (view full) --- 2849 */ 2850static int 2851bge_add_intrs(bge_t *bgep, int intr_type) 2852{ 2853 dev_info_t *dip = bgep->devinfo; 2854 int avail, actual, intr_size, count = 0; 2855 int i, flag, ret; 2856 | 2759 bgep->asf_status = ASF_STAT_STOP; 2760 2761 bge_asf_pre_reset_operations(bgep, BGE_SHUTDOWN_RESET); 2762 2763 if (bgep->asf_pseudostop) { 2764 bgep->link_up_msg = bgep->link_down_msg = " (stopped)"; 2765 bge_chip_stop(bgep, B_FALSE); 2766 bgep->bge_mac_state = BGE_MAC_STOPPED; --- 95 unchanged lines hidden (view full) --- 2862 */ 2863static int 2864bge_add_intrs(bge_t *bgep, int intr_type) 2865{ 2866 dev_info_t *dip = bgep->devinfo; 2867 int avail, actual, intr_size, count = 0; 2868 int i, flag, ret; 2869 |
2857 bge_log(bgep, "bge_add_intrs: interrupt type 0x%x\n", intr_type); | 2870 BGE_DEBUG(("bge_add_intrs($%p, 0x%x)", (void *)bgep, intr_type)); |
2858 2859 /* Get number of interrupts */ 2860 ret = ddi_intr_get_nintrs(dip, intr_type, &count); 2861 if ((ret != DDI_SUCCESS) || (count == 0)) { 2862 bge_error(bgep, "ddi_intr_get_nintrs() failure, ret: %d, " 2863 "count: %d", ret, count); 2864 2865 return (DDI_FAILURE); --- 4 unchanged lines hidden (view full) --- 2870 if ((ret != DDI_SUCCESS) || (avail == 0)) { 2871 bge_error(bgep, "ddi_intr_get_navail() failure, " 2872 "ret: %d, avail: %d\n", ret, avail); 2873 2874 return (DDI_FAILURE); 2875 } 2876 2877 if (avail < count) { | 2871 2872 /* Get number of interrupts */ 2873 ret = ddi_intr_get_nintrs(dip, intr_type, &count); 2874 if ((ret != DDI_SUCCESS) || (count == 0)) { 2875 bge_error(bgep, "ddi_intr_get_nintrs() failure, ret: %d, " 2876 "count: %d", ret, count); 2877 2878 return (DDI_FAILURE); --- 4 unchanged lines hidden (view full) --- 2883 if ((ret != DDI_SUCCESS) || (avail == 0)) { 2884 bge_error(bgep, "ddi_intr_get_navail() failure, " 2885 "ret: %d, avail: %d\n", ret, avail); 2886 2887 return (DDI_FAILURE); 2888 } 2889 2890 if (avail < count) { |
2878 bge_log(bgep, "nitrs() returned %d, navail returned %d\n", 2879 count, avail); | 2891 BGE_DEBUG(("%s: nintrs() returned %d, navail returned %d", 2892 bgep->ifname, count, avail)); |
2880 } 2881 2882 /* 2883 * BGE hardware generates only single MSI even though it claims 2884 * to support multiple MSIs. So, hard code MSI count value to 1. 2885 */ 2886 if (intr_type == DDI_INTR_TYPE_MSI) { 2887 count = 1; --- 13 unchanged lines hidden (view full) --- 2901 if ((ret != DDI_SUCCESS) || (actual == 0)) { 2902 bge_error(bgep, "ddi_intr_alloc() failed %d\n", ret); 2903 2904 kmem_free(bgep->htable, intr_size); 2905 return (DDI_FAILURE); 2906 } 2907 2908 if (actual < count) { | 2893 } 2894 2895 /* 2896 * BGE hardware generates only single MSI even though it claims 2897 * to support multiple MSIs. So, hard code MSI count value to 1. 2898 */ 2899 if (intr_type == DDI_INTR_TYPE_MSI) { 2900 count = 1; --- 13 unchanged lines hidden (view full) --- 2914 if ((ret != DDI_SUCCESS) || (actual == 0)) { 2915 bge_error(bgep, "ddi_intr_alloc() failed %d\n", ret); 2916 2917 kmem_free(bgep->htable, intr_size); 2918 return (DDI_FAILURE); 2919 } 2920 2921 if (actual < count) { |
2909 bge_log(bgep, "Requested: %d, Received: %d\n", count, actual); | 2922 BGE_DEBUG(("%s: Requested: %d, Received: %d", 2923 bgep->ifname, count, actual)); |
2910 } 2911 2912 bgep->intr_cnt = actual; 2913 2914 /* 2915 * Get priority for first msi, assume remaining are all the same 2916 */ 2917 if ((ret = ddi_intr_get_pri(bgep->htable[0], &bgep->intr_pri)) != --- 47 unchanged lines hidden (view full) --- 2965 * 2966 * Unregister FIXED or MSI interrupts 2967 */ 2968static void 2969bge_rem_intrs(bge_t *bgep) 2970{ 2971 int i; 2972 | 2924 } 2925 2926 bgep->intr_cnt = actual; 2927 2928 /* 2929 * Get priority for first msi, assume remaining are all the same 2930 */ 2931 if ((ret = ddi_intr_get_pri(bgep->htable[0], &bgep->intr_pri)) != --- 47 unchanged lines hidden (view full) --- 2979 * 2980 * Unregister FIXED or MSI interrupts 2981 */ 2982static void 2983bge_rem_intrs(bge_t *bgep) 2984{ 2985 int i; 2986 |
2973 bge_log(bgep, "bge_rem_intrs\n"); | 2987 BGE_DEBUG(("bge_rem_intrs($%p)", (void *)bgep)); |
2974 2975 /* Call ddi_intr_remove_handler() */ 2976 for (i = 0; i < bgep->intr_cnt; i++) { 2977 (void) ddi_intr_remove_handler(bgep->htable[i]); 2978 (void) ddi_intr_free(bgep->htable[i]); 2979 } 2980 2981 kmem_free(bgep->htable, bgep->intr_cnt * sizeof (ddi_intr_handle_t)); --- 34 unchanged lines hidden --- | 2988 2989 /* Call ddi_intr_remove_handler() */ 2990 for (i = 0; i < bgep->intr_cnt; i++) { 2991 (void) ddi_intr_remove_handler(bgep->htable[i]); 2992 (void) ddi_intr_free(bgep->htable[i]); 2993 } 2994 2995 kmem_free(bgep->htable, bgep->intr_cnt * sizeof (ddi_intr_handle_t)); --- 34 unchanged lines hidden --- |