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 ---