xref: /haiku/src/add-ons/kernel/drivers/network/ether/wb840/driver.c (revision 268f99dd7dc4bd7474a8bd2742d3f1ec1de6752a)
1*cbe0a0c4SAugustin Cavalier /* Copyright (c) 2003-2011
2*cbe0a0c4SAugustin Cavalier  * Stefano Ceccherini <stefano.ceccherini@gmail.com>. All rights reserved.
3*cbe0a0c4SAugustin Cavalier  */
4*cbe0a0c4SAugustin Cavalier #include "debug.h"
5*cbe0a0c4SAugustin Cavalier #include <Debug.h>
6*cbe0a0c4SAugustin Cavalier 
7*cbe0a0c4SAugustin Cavalier #include <KernelExport.h>
8*cbe0a0c4SAugustin Cavalier #include <Errors.h>
9*cbe0a0c4SAugustin Cavalier #include <stdlib.h>
10*cbe0a0c4SAugustin Cavalier #include <stdio.h>
11*cbe0a0c4SAugustin Cavalier #include <string.h>
12*cbe0a0c4SAugustin Cavalier 
13*cbe0a0c4SAugustin Cavalier #include "wb840.h"
14*cbe0a0c4SAugustin Cavalier #include "device.h"
15*cbe0a0c4SAugustin Cavalier #include "driver.h"
16*cbe0a0c4SAugustin Cavalier 
17*cbe0a0c4SAugustin Cavalier #define MAX_CARDS 4
18*cbe0a0c4SAugustin Cavalier 
19*cbe0a0c4SAugustin Cavalier int32 api_version = B_CUR_DRIVER_API_VERSION;
20*cbe0a0c4SAugustin Cavalier 
21*cbe0a0c4SAugustin Cavalier pci_module_info* gPci;
22*cbe0a0c4SAugustin Cavalier char* gDevNameList[MAX_CARDS + 1];
23*cbe0a0c4SAugustin Cavalier pci_info* gDevList[MAX_CARDS];
24*cbe0a0c4SAugustin Cavalier 
25*cbe0a0c4SAugustin Cavalier 
26*cbe0a0c4SAugustin Cavalier static bool
probe(pci_info * item)27*cbe0a0c4SAugustin Cavalier probe(pci_info* item)
28*cbe0a0c4SAugustin Cavalier {
29*cbe0a0c4SAugustin Cavalier 	if ((item->vendor_id == WB_VENDORID && item->device_id == WB_DEVICEID_840F)
30*cbe0a0c4SAugustin Cavalier 			|| (item->vendor_id == CP_VENDORID && item->device_id == CP_DEVICEID_RL100))
31*cbe0a0c4SAugustin Cavalier 		return true;
32*cbe0a0c4SAugustin Cavalier 	return false;
33*cbe0a0c4SAugustin Cavalier }
34*cbe0a0c4SAugustin Cavalier 
35*cbe0a0c4SAugustin Cavalier 
36*cbe0a0c4SAugustin Cavalier status_t
init_hardware(void)37*cbe0a0c4SAugustin Cavalier init_hardware(void)
38*cbe0a0c4SAugustin Cavalier {
39*cbe0a0c4SAugustin Cavalier 	LOG((DEVICE_NAME ": init_hardware\n"));
40*cbe0a0c4SAugustin Cavalier 	return B_OK;
41*cbe0a0c4SAugustin Cavalier }
42*cbe0a0c4SAugustin Cavalier 
43*cbe0a0c4SAugustin Cavalier 
44*cbe0a0c4SAugustin Cavalier status_t
init_driver(void)45*cbe0a0c4SAugustin Cavalier init_driver(void)
46*cbe0a0c4SAugustin Cavalier {
47*cbe0a0c4SAugustin Cavalier 	struct pci_info* item = NULL;
48*cbe0a0c4SAugustin Cavalier 	int index = 0;
49*cbe0a0c4SAugustin Cavalier 	int card_found = 0;
50*cbe0a0c4SAugustin Cavalier 	char devName[64];
51*cbe0a0c4SAugustin Cavalier 	status_t status;
52*cbe0a0c4SAugustin Cavalier 
53*cbe0a0c4SAugustin Cavalier 	LOG((DEVICE_NAME ": init_driver\n"));
54*cbe0a0c4SAugustin Cavalier 
55*cbe0a0c4SAugustin Cavalier #ifdef DEBUG
56*cbe0a0c4SAugustin Cavalier 	set_dprintf_enabled(true);
57*cbe0a0c4SAugustin Cavalier #endif
58*cbe0a0c4SAugustin Cavalier 
59*cbe0a0c4SAugustin Cavalier 	status = get_module(B_PCI_MODULE_NAME, (module_info**)&gPci);
60*cbe0a0c4SAugustin Cavalier 	if (status < B_OK)
61*cbe0a0c4SAugustin Cavalier 		return status;
62*cbe0a0c4SAugustin Cavalier 
63*cbe0a0c4SAugustin Cavalier 	item = (pci_info*)malloc(sizeof(pci_info));
64*cbe0a0c4SAugustin Cavalier 	if (item == NULL) {
65*cbe0a0c4SAugustin Cavalier 		put_module(B_PCI_MODULE_NAME);
66*cbe0a0c4SAugustin Cavalier 		return B_NO_MEMORY;
67*cbe0a0c4SAugustin Cavalier 	}
68*cbe0a0c4SAugustin Cavalier 
69*cbe0a0c4SAugustin Cavalier 	while (gPci->get_nth_pci_info(index, item) == B_OK) {
70*cbe0a0c4SAugustin Cavalier 		if (probe(item)) {
71*cbe0a0c4SAugustin Cavalier 			gPci->write_pci_config(item->bus, item->device, item->function,
72*cbe0a0c4SAugustin Cavalier 				PCI_command, 2, PCI_command_master | gPci->read_pci_config(
73*cbe0a0c4SAugustin Cavalier 					item->bus, item->device, item->function,
74*cbe0a0c4SAugustin Cavalier 					PCI_command, 2));
75*cbe0a0c4SAugustin Cavalier 			gDevList[card_found++] = item;
76*cbe0a0c4SAugustin Cavalier 
77*cbe0a0c4SAugustin Cavalier 			dprintf(DEVICE_NAME ": revision = %x\n", item->revision);
78*cbe0a0c4SAugustin Cavalier 
79*cbe0a0c4SAugustin Cavalier 			item = (pci_info *)malloc(sizeof(pci_info));
80*cbe0a0c4SAugustin Cavalier 		}
81*cbe0a0c4SAugustin Cavalier 		index++;
82*cbe0a0c4SAugustin Cavalier 	}
83*cbe0a0c4SAugustin Cavalier 	free(item);
84*cbe0a0c4SAugustin Cavalier 
85*cbe0a0c4SAugustin Cavalier 	gDevList[card_found] = NULL;
86*cbe0a0c4SAugustin Cavalier 
87*cbe0a0c4SAugustin Cavalier 	if (card_found == 0) {
88*cbe0a0c4SAugustin Cavalier 		put_module(B_PCI_MODULE_NAME);
89*cbe0a0c4SAugustin Cavalier 		return ENODEV;
90*cbe0a0c4SAugustin Cavalier 	}
91*cbe0a0c4SAugustin Cavalier 
92*cbe0a0c4SAugustin Cavalier 	for (index = 0; index < card_found; index++) {
93*cbe0a0c4SAugustin Cavalier 		sprintf(devName, DEVICE_NAME "/%d", index);
94*cbe0a0c4SAugustin Cavalier 		LOG((DEVICE_NAME ":enabled %s\n", devName));
95*cbe0a0c4SAugustin Cavalier 		gDevNameList[index] = strdup(devName);
96*cbe0a0c4SAugustin Cavalier 	}
97*cbe0a0c4SAugustin Cavalier 
98*cbe0a0c4SAugustin Cavalier 	gDevNameList[index] = NULL;
99*cbe0a0c4SAugustin Cavalier 
100*cbe0a0c4SAugustin Cavalier 	return B_OK;
101*cbe0a0c4SAugustin Cavalier }
102*cbe0a0c4SAugustin Cavalier 
103*cbe0a0c4SAugustin Cavalier 
104*cbe0a0c4SAugustin Cavalier void
uninit_driver(void)105*cbe0a0c4SAugustin Cavalier uninit_driver(void)
106*cbe0a0c4SAugustin Cavalier {
107*cbe0a0c4SAugustin Cavalier 	int32 i = 0;
108*cbe0a0c4SAugustin Cavalier 
109*cbe0a0c4SAugustin Cavalier 	LOG((DEVICE_NAME ": uninit_driver()\n"));
110*cbe0a0c4SAugustin Cavalier 	while(gDevNameList[i] != NULL) {
111*cbe0a0c4SAugustin Cavalier 		free(gDevList[i]);
112*cbe0a0c4SAugustin Cavalier 		free(gDevNameList[i]);
113*cbe0a0c4SAugustin Cavalier 		i++;
114*cbe0a0c4SAugustin Cavalier 	}
115*cbe0a0c4SAugustin Cavalier 
116*cbe0a0c4SAugustin Cavalier 	put_module(B_PCI_MODULE_NAME);
117*cbe0a0c4SAugustin Cavalier }
118*cbe0a0c4SAugustin Cavalier 
119*cbe0a0c4SAugustin Cavalier 
120*cbe0a0c4SAugustin Cavalier const char**
publish_devices()121*cbe0a0c4SAugustin Cavalier publish_devices()
122*cbe0a0c4SAugustin Cavalier {
123*cbe0a0c4SAugustin Cavalier 	return (const char**)gDevNameList;
124*cbe0a0c4SAugustin Cavalier }
125*cbe0a0c4SAugustin Cavalier 
126*cbe0a0c4SAugustin Cavalier 
127*cbe0a0c4SAugustin Cavalier device_hooks*
find_device(const char * name)128*cbe0a0c4SAugustin Cavalier find_device(const char* name)
129*cbe0a0c4SAugustin Cavalier {
130*cbe0a0c4SAugustin Cavalier 	int32 i;
131*cbe0a0c4SAugustin Cavalier 	char* item;
132*cbe0a0c4SAugustin Cavalier 
133*cbe0a0c4SAugustin Cavalier 	LOG((DEVICE_NAME ": find_device()\n"));
134*cbe0a0c4SAugustin Cavalier 	// Find device name
135*cbe0a0c4SAugustin Cavalier 	for (i = 0; (item = gDevNameList[i]); i++) {
136*cbe0a0c4SAugustin Cavalier 		if (!strcmp(name, item)) {
137*cbe0a0c4SAugustin Cavalier 			return &gDeviceHooks;
138*cbe0a0c4SAugustin Cavalier 		}
139*cbe0a0c4SAugustin Cavalier 	}
140*cbe0a0c4SAugustin Cavalier 	return NULL; // Device not found
141*cbe0a0c4SAugustin Cavalier }
142