|
@@ -120,6 +120,127 @@ static int wbsoft_start(struct ieee80211_hw *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void hal_set_radio_mode(struct hw_data *pHwData, unsigned char radio_off)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (radio_off) //disable Baseband receive off
|
|
|
+ {
|
|
|
+ pHwData->CurrentRadioSw = 1; // off
|
|
|
+ reg->M24_MacControl &= 0xffffffbf;
|
|
|
+ } else {
|
|
|
+ pHwData->CurrentRadioSw = 0; // on
|
|
|
+ reg->M24_MacControl |= 0x00000040;
|
|
|
+ }
|
|
|
+ Wb35Reg_Write(pHwData, 0x0824, reg->M24_MacControl);
|
|
|
+}
|
|
|
+
|
|
|
+static void hal_set_beacon_period(struct hw_data *pHwData, u16 beacon_period)
|
|
|
+{
|
|
|
+ u32 tmp;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ pHwData->BeaconPeriod = beacon_period;
|
|
|
+ tmp = pHwData->BeaconPeriod << 16;
|
|
|
+ tmp |= pHwData->ProbeDelay;
|
|
|
+ Wb35Reg_Write(pHwData, 0x0848, tmp);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+hal_set_current_channel_ex(struct hw_data *pHwData, ChanInfo channel)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ printk("Going to channel: %d/%d\n", channel.band, channel.ChanNo);
|
|
|
+
|
|
|
+ RFSynthesizer_SwitchingChannel(pHwData, channel); // Switch channel
|
|
|
+ pHwData->Channel = channel.ChanNo;
|
|
|
+ pHwData->band = channel.band;
|
|
|
+#ifdef _PE_STATE_DUMP_
|
|
|
+ printk("Set channel is %d, band =%d\n", pHwData->Channel,
|
|
|
+ pHwData->band);
|
|
|
+#endif
|
|
|
+ reg->M28_MacControl &= ~0xff; // Clean channel information field
|
|
|
+ reg->M28_MacControl |= channel.ChanNo;
|
|
|
+ Wb35Reg_WriteWithCallbackValue(pHwData, 0x0828, reg->M28_MacControl,
|
|
|
+ (s8 *) & channel, sizeof(ChanInfo));
|
|
|
+}
|
|
|
+
|
|
|
+static void hal_set_current_channel(struct hw_data *pHwData, ChanInfo channel)
|
|
|
+{
|
|
|
+ hal_set_current_channel_ex(pHwData, channel);
|
|
|
+}
|
|
|
+
|
|
|
+static void hal_set_accept_broadcast(struct hw_data *pHwData, u8 enable)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ reg->M00_MacControl &= ~0x02000000; //The HW value
|
|
|
+
|
|
|
+ if (enable)
|
|
|
+ reg->M00_MacControl |= 0x02000000; //The HW value
|
|
|
+
|
|
|
+ Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl);
|
|
|
+}
|
|
|
+
|
|
|
+//for wep key error detection, we need to accept broadcast packets to be received temporary.
|
|
|
+static void hal_set_accept_promiscuous(struct hw_data *pHwData, u8 enable)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+ if (enable) {
|
|
|
+ reg->M00_MacControl |= 0x00400000;
|
|
|
+ Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl);
|
|
|
+ } else {
|
|
|
+ reg->M00_MacControl &= ~0x00400000;
|
|
|
+ Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void hal_set_accept_multicast(struct hw_data *pHwData, u8 enable)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ reg->M00_MacControl &= ~0x01000000; //The HW value
|
|
|
+ if (enable)
|
|
|
+ reg->M00_MacControl |= 0x01000000; //The HW value
|
|
|
+ Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl);
|
|
|
+}
|
|
|
+
|
|
|
+static void hal_set_accept_beacon(struct hw_data *pHwData, u8 enable)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ // 20040108 debug
|
|
|
+ if (!enable) //Due to SME and MLME are not suitable for 35
|
|
|
+ return;
|
|
|
+
|
|
|
+ reg->M00_MacControl &= ~0x04000000; //The HW value
|
|
|
+ if (enable)
|
|
|
+ reg->M00_MacControl |= 0x04000000; //The HW value
|
|
|
+
|
|
|
+ Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl);
|
|
|
+}
|
|
|
+
|
|
|
static int wbsoft_config(struct ieee80211_hw *dev, u32 changed)
|
|
|
{
|
|
|
struct wbsoft_priv *priv = dev->priv;
|
|
@@ -171,6 +292,87 @@ static const struct ieee80211_ops wbsoft_ops = {
|
|
|
.get_tsf = wbsoft_get_tsf,
|
|
|
};
|
|
|
|
|
|
+static void
|
|
|
+hal_set_ethernet_address(struct hw_data *pHwData, u8 * current_address)
|
|
|
+{
|
|
|
+ u32 ltmp[2];
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ memcpy(pHwData->CurrentMacAddress, current_address, ETH_ALEN);
|
|
|
+
|
|
|
+ ltmp[0] = cpu_to_le32(*(u32 *) pHwData->CurrentMacAddress);
|
|
|
+ ltmp[1] =
|
|
|
+ cpu_to_le32(*(u32 *) (pHwData->CurrentMacAddress + 4)) & 0xffff;
|
|
|
+
|
|
|
+ Wb35Reg_BurstWrite(pHwData, 0x03e8, ltmp, 2, AUTO_INCREMENT);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+hal_get_permanent_address(struct hw_data *pHwData, u8 * pethernet_address)
|
|
|
+{
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return;
|
|
|
+
|
|
|
+ memcpy(pethernet_address, pHwData->PermanentMacAddress, 6);
|
|
|
+}
|
|
|
+
|
|
|
+static void hal_stop(struct hw_data *pHwData)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ pHwData->Wb35Rx.rx_halt = 1;
|
|
|
+ Wb35Rx_stop(pHwData);
|
|
|
+
|
|
|
+ pHwData->Wb35Tx.tx_halt = 1;
|
|
|
+ Wb35Tx_stop(pHwData);
|
|
|
+
|
|
|
+ reg->D00_DmaControl &= ~0xc0000000; //Tx Off, Rx Off
|
|
|
+ Wb35Reg_Write(pHwData, 0x0400, reg->D00_DmaControl);
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned char hal_idle(struct hw_data *pHwData)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+ struct wb_usb *pWbUsb = &pHwData->WbUsb;
|
|
|
+
|
|
|
+ if (!pHwData->SurpriseRemove
|
|
|
+ && (pWbUsb->DetectCount || reg->EP0vm_state != VM_STOP))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+u8 hal_get_antenna_number(struct hw_data *pHwData)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if ((reg->BB2C & BIT(11)) == 0)
|
|
|
+ return 0;
|
|
|
+ else
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+/* 0 : radio on; 1: radio off */
|
|
|
+static u8 hal_get_hw_radio_off(struct hw_data * pHwData)
|
|
|
+{
|
|
|
+ struct wb35_reg *reg = &pHwData->reg;
|
|
|
+
|
|
|
+ if (pHwData->SurpriseRemove)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ //read the bit16 of register U1B0
|
|
|
+ Wb35Reg_Read(pHwData, 0x3b0, ®->U1B0);
|
|
|
+ if ((reg->U1B0 & 0x00010000)) {
|
|
|
+ pHwData->CurrentRadioHw = 1;
|
|
|
+ return 1;
|
|
|
+ } else {
|
|
|
+ pHwData->CurrentRadioHw = 0;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static u8 LED_GRAY[20] = {
|
|
|
0, 3, 4, 6, 8, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 8, 6, 4, 2
|
|
|
};
|