static s32 _LLTWrite(struct adapter *padapter, u32 address, u32 data) { s32 status = _SUCCESS; s32 count = 0; u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS); u16 LLTReg = REG_LLT_INIT; usb_write32(padapter, LLTReg, value); /* polling */ do { value = usb_read32(padapter, LLTReg); if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)) break; if (count > POLLING_LLT_THRESHOLD) { RT_TRACE(_module_hal_init_c_, _drv_err_, ("Failed to polling write LLT done at address %d!\n", address)); status = _FAIL; break; } udelay(5); } while (count++); return status; }
static void _rtl88e_fw_block_write(struct adapter *adapt, const u8 *buffer, u32 size) { u32 blk_sz = sizeof(u32); const u8 *byte_buffer; const u32 *dword_buffer = (u32 *)buffer; u32 i, write_address, blk_cnt, remain; blk_cnt = size / blk_sz; remain = size % blk_sz; write_address = FW_8192C_START_ADDRESS; for (i = 0; i < blk_cnt; i++, write_address += blk_sz) usb_write32(adapt, write_address, dword_buffer[i]); byte_buffer = buffer + blk_cnt * blk_sz; for (i = 0; i < remain; i++, write_address++) usb_write8(adapt, write_address, byte_buffer[i]); }
static int _rtl88e_fw_free_to_go(struct adapter *adapt) { int err = -EIO; u32 counter = 0; u32 value32; do { value32 = usb_read32(adapt, REG_MCUFWDL); if (value32 & FWDL_ChkSum_rpt) break; } while (counter++ < POLLING_READY_TIMEOUT_COUNT); if (counter >= POLLING_READY_TIMEOUT_COUNT) goto exit; value32 = usb_read32(adapt, REG_MCUFWDL); value32 |= MCUFWDL_RDY; value32 &= ~WINTINI_RDY; usb_write32(adapt, REG_MCUFWDL, value32); rtl88e_firmware_selfreset(adapt); counter = 0; do { value32 = usb_read32(adapt, REG_MCUFWDL); if (value32 & WINTINI_RDY) { err = 0; goto exit; } udelay(FW_8192C_POLLING_DELAY); } while (counter++ < POLLING_READY_TIMEOUT_COUNT); exit: return err; }
int proc_set_write_reg(struct file *file, const char __user *buffer, unsigned long count, void *data) { struct net_device *dev = data; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); char tmp[32]; u32 addr, val, len; if (count < 3) { DBG_88E("argument size is less than 3\n"); return -EFAULT; } if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { int num = sscanf(tmp, "%x %x %x", &addr, &val, &len); if (num != 3) { DBG_88E("invalid write_reg parameter!\n"); return count; } switch (len) { case 1: usb_write8(padapter, addr, (u8)val); break; case 2: usb_write16(padapter, addr, (u16)val); break; case 4: usb_write32(padapter, addr, val); break; default: DBG_88E("error write length =%d", len); break; } } return count; }