1/*
2 * Copyright (c) 2008, ETH Zurich. All rights reserved.
3 *
4 * This file is distributed under the terms in the attached LICENSE file.
5 * If you do not find this file, copies can be found by writing to:
6 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
7 */
8/*
9 * e1000_helpers.c
10 *
11 *  Created on: Feb 14, 2013
12 *      Author: mao
13 */
14#include "e1000n.h"
15#include <pci/devids.h>
16
17/*****************************************************************
18 *
19 *
20 ****************************************************************/
21e1000_mac_type_t e1000_get_mac_type(uint32_t vendor, uint32_t device_id)
22{
23    if (vendor == PCI_VENDOR_INTEL) {
24
25        switch (device_id) {
26        case E1000_DEVICE_82542:
27            return e1000_82542;
28        case E1000_DEVICE_82543GC_FIBER:
29        case E1000_DEVICE_82543GC_COPPER:
30            return e1000_82543;
31        case E1000_DEVICE_82544EI_COPPER:
32        case E1000_DEVICE_82544EI_FIBER:
33        case E1000_DEVICE_82544GC_COPPER:
34        case E1000_DEVICE_82544GC_LOM:
35            return e1000_82544;
36        case E1000_DEVICE_82540EM:
37        case E1000_DEVICE_82540EM_LOM:
38        case E1000_DEVICE_82540EP:
39        case E1000_DEVICE_82540EP_LOM:
40        case E1000_DEVICE_82540EP_LP:
41            return e1000_82540;
42        case E1000_DEVICE_82545EM_COPPER:
43        case E1000_DEVICE_82545EM_FIBER:
44            return e1000_82545;
45        case E1000_DEVICE_82545GM_COPPER:
46        case E1000_DEVICE_82545GM_FIBER:
47        case E1000_DEVICE_82545GM_SERDES:
48            return e1000_82545_rev_3;
49        case E1000_DEVICE_82546EB_COPPER:
50        case E1000_DEVICE_82546EB_FIBER:
51        case E1000_DEVICE_82546EB_QUAD_COPPER:
52            return e1000_82546;
53        case E1000_DEVICE_82546GB_COPPER:
54        case E1000_DEVICE_82546GB_FIBER:
55        case E1000_DEVICE_82546GB_SERDES:
56        case E1000_DEVICE_82546GB_PCIE:
57        case E1000_DEVICE_82546GB_QUAD_COPPER:
58        case E1000_DEVICE_82546GB_QUAD_COPPER_KSP3:
59            return e1000_82546_rev_3;
60        case E1000_DEVICE_82541EI:
61        case E1000_DEVICE_82541EI_MOBILE:
62        case E1000_DEVICE_82541ER_LOM:
63            return e1000_82541;
64        case E1000_DEVICE_82541ER:
65        case E1000_DEVICE_82541GI:
66        case E1000_DEVICE_82541GI_LF:
67        case E1000_DEVICE_82541GI_MOBILE:
68            return e1000_82541_rev_2;
69        case E1000_DEVICE_82547EI:
70        case E1000_DEVICE_82547EI_MOBILE:
71            return e1000_82547;
72        case E1000_DEVICE_82547GI:
73            return e1000_82547_rev_2;
74        case E1000_DEVICE_82563EB:
75            return e1000_82563;
76        case E1000_DEVICE_82571EB_COPPER:
77        case E1000_DEVICE_82571EB_FIBER:
78        case E1000_DEVICE_82571EB_SERDES:
79        case E1000_DEVICE_82571EB_SERDES_DUAL:
80        case E1000_DEVICE_82571EB_SERDES_QUAD:
81        case E1000_DEVICE_82571EB_QUAD_COPPER:
82        case E1000_DEVICE_82571EB_QUAD_FIBER:
83        case E1000_DEVICE_82571EB_QUAD_COPPER_LOWPROFILE:
84            return e1000_82571;
85        case E1000_DEVICE_82572EI_COPPER:
86        case E1000_DEVICE_82572EI_FIBER:
87        case E1000_DEVICE_82572EI_SERDES:
88        case E1000_DEVICE_82572EI:
89            return e1000_82572;
90        case E1000_DEVICE_82573E:
91        case E1000_DEVICE_82573E_IAMT:
92        case E1000_DEVICE_82573L:
93            return e1000_82573;
94        case E1000_DEVICE_82574L:
95            return e1000_82574;
96        case E1000_DEVICE_82575EB:
97            return e1000_82575;
98        case E1000_DEVICE_82576EG:
99            return e1000_82576;
100        case E1000_DEVICE_I210:
101        case E1000_DEVICE_I219:
102            return e1000_I210;
103        case E1000_DEVICE_I350_EEPROM_LESS:
104        case E1000_DEVICE_I350_COPPER:
105        case E1000_DEVICE_I350_FIBER:
106        case E1000_DEVICE_I350_BACKPANE:
107        case E1000_DEVICE_I350_SGMII:
108        case E1000_DEVICE_I350_DUMMY:
109            return e1000_I350;
110        default:
111            E1000_DEBUG("Unsupported device: vendor: 0x%x,  device id: 0x%x\n", PCI_VENDOR_INTEL, device_id);
112            return e1000_undefined;
113        }
114    }
115
116    return e1000_undefined;
117}
118
119char * e1000_mac_type_to_str(e1000_mac_type_t mt){
120    char * names[] = {
121        "undefined",
122        "82542",
123        "82543",
124        "82544",
125        "82540",
126        "82545",
127        "82545_rev_3",
128        "82546",
129        "82546_rev_3",
130        "82541",
131        "82541_rev_2",
132        "82547",
133        "82547_rev_2",
134        "82563",
135        "82571",
136        "82572",
137        "82573",
138        "82574",
139        "82575",
140        "82576",
141        "I210",
142        "I219",
143        "I350"
144    };
145    if(mt >= e1000_num_macs) return NULL;
146    return names[mt];
147};
148
149bool e1000_supports_msix(e1000_mac_type_t mt)
150{
151        switch (mt) {
152        case e1000_82575:
153        case e1000_82576:
154        case e1000_82574:
155        //case e1000_I350:
156        case e1000_I210:
157            return true;
158        default:
159            return false;
160        }
161}
162
163
164cycles_t tscperms;
165
166
167
168
169