blob: 61535c356854385f793026f86d5e97d5503a4704 [file] [log] [blame]
San Mehatdc266072009-05-06 11:16:52 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
San Mehat3c5a6f02009-05-22 15:36:13 -070016
San Mehatdc266072009-05-06 11:16:52 -070017#include <stdlib.h>
18#include <fcntl.h>
19#include <errno.h>
20#include <string.h>
San Mehat5fc41292009-06-16 10:50:06 -070021#include <sys/types.h>
22#include <sys/socket.h>
23#include <arpa/inet.h>
San Mehatdc266072009-05-06 11:16:52 -070024
25#include <cutils/properties.h>
26#define LOG_TAG "TiwlanWifiController"
27#include <cutils/log.h>
28
San Mehat3c5a6f02009-05-22 15:36:13 -070029#include "PropertyManager.h"
San Mehatdc266072009-05-06 11:16:52 -070030#include "TiwlanWifiController.h"
San Mehat5fc41292009-06-16 10:50:06 -070031#include "TiwlanEventListener.h"
San Mehatdc266072009-05-06 11:16:52 -070032
33#define DRIVER_PROP_NAME "wlan.driver.status"
34
35extern "C" int sched_yield(void);
36
San Mehat3aff2d12009-06-15 14:10:44 -070037TiwlanWifiController::TiwlanWifiController(PropertyManager *propmngr,
38 IControllerHandler *handlers,
39 char *modpath, char *modname,
40 char *modargs) :
41 WifiController(propmngr, handlers, modpath, modname,
42 modargs) {
San Mehat5fc41292009-06-16 10:50:06 -070043 mEventListener = NULL;
44 mListenerSock = -1;
San Mehatdc266072009-05-06 11:16:52 -070045}
46
47int TiwlanWifiController::powerUp() {
48 return 0; // Powerup is currently done when the driver is loaded
49}
50
51int TiwlanWifiController::powerDown() {
San Mehat5fc41292009-06-16 10:50:06 -070052 if (mEventListener) {
53 delete mEventListener;
54 close(mListenerSock);
55 mListenerSock = -1;
56 mEventListener = NULL;
57 }
58
San Mehatdc266072009-05-06 11:16:52 -070059 return 0; // Powerdown is currently done when the driver is unloaded
60}
61
62bool TiwlanWifiController::isPoweredUp() {
63 return isKernelModuleLoaded(getModuleName());
64}
65
66int TiwlanWifiController::loadFirmware() {
67 char driver_status[PROPERTY_VALUE_MAX];
68 int count = 100;
69
San Mehatdc266072009-05-06 11:16:52 -070070 property_set("ctl.start", "wlan_loader");
71 sched_yield();
72
73 // Wait for driver to be ready
74 while (count-- > 0) {
75 if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
San Mehat5fc41292009-06-16 10:50:06 -070076 if (!strcmp(driver_status, "ok")) {
77 LOGD("Firmware loaded OK");
78
79 if (startDriverEventListener()) {
80 LOGW("Failed to start driver event listener");
81 }
82
San Mehatdc266072009-05-06 11:16:52 -070083 return 0;
San Mehat5fc41292009-06-16 10:50:06 -070084 } else if (!strcmp(DRIVER_PROP_NAME, "failed")) {
85 LOGE("Firmware load failed");
San Mehatdc266072009-05-06 11:16:52 -070086 return -1;
San Mehat5fc41292009-06-16 10:50:06 -070087 }
San Mehatdc266072009-05-06 11:16:52 -070088 }
89 usleep(200000);
90 }
91 property_set(DRIVER_PROP_NAME, "timeout");
San Mehat5fc41292009-06-16 10:50:06 -070092 LOGE("Firmware load timed out");
San Mehatdc266072009-05-06 11:16:52 -070093 return -1;
94}
San Mehat1441e762009-05-07 11:37:10 -070095
San Mehat5fc41292009-06-16 10:50:06 -070096int TiwlanWifiController::startDriverEventListener() {
97 struct sockaddr_in addr;
98 int s;
99
100 if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
101 return -1;
102
103 memset(&addr, 0, sizeof(addr));
104 addr.sin_family = AF_INET;
105 addr.sin_addr.s_addr = htonl(INADDR_ANY);
106 addr.sin_port = htons(TI_DRIVER_MSG_PORT);
107
108 if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
109 close(s);
110 return -1;
111 }
112
113 mEventListener = new TiwlanEventListener(s);
114
115 if (mEventListener->startListener()) {
116 LOGE("Error starting driver listener (%s)", strerror(errno));
117 delete mEventListener;
118 mEventListener = NULL;
119 close(s);
120 return -1;
121 }
122 mListenerSock = s;
123 return 0;
124}
125
San Mehat1441e762009-05-07 11:37:10 -0700126bool TiwlanWifiController::isFirmwareLoaded() {
San Mehat69772dc2009-05-10 09:27:07 -0700127 // Always load the firmware
San Mehat1441e762009-05-07 11:37:10 -0700128 return false;
129}