static int atl1e_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) { struct atl1e_adapter *adapter = netdev_priv(netdev); if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE)) return -EOPNOTSUPP; if (wol->wolopts & (WAKE_MCAST|WAKE_BCAST|WAKE_MCAST)) { AT_DBG("Interface does not support broadcast/multicast frame wake-up packets\n"); return -EOPNOTSUPP; } /* these settings will always override what we currently have */ adapter->wol = 0; if (wol->wolopts & WAKE_MAGIC) { adapter->wol |= AT_WUFC_MAG; DEBUGOUT("magic WOL enable"); } if (wol->wolopts & WAKE_PHY) { adapter->wol |= AT_WUFC_LNKC; DEBUGOUT("linkchg WOL enable"); } return 0; }
static void ICACHE_FLASH_ATTR parseWsFrame(char *data, WSFrame *frame) { uint8_t masked_length; frame->flags = (*data) & FLAGS_MASK; frame->opcode = (*data) & OPCODE_MASK; //next byte data += 1; frame->isMasked = (*data) & IS_MASKED; frame->payloadLength = (*data) & PAYLOAD_MASK; //next byte data += 1; if (frame->payloadLength == 126) { os_memcpy(&frame->payloadLength, data, sizeof(uint16_t)); data += sizeof(uint16_t); } else if (frame->payloadLength == 127) { //CANNOT support. AT_DBG("CANNOT SUPPORT BIG DATA PACKAGE."); os_memcpy(&frame->payloadLength, data, sizeof(uint64_t)); data += sizeof(uint64_t); } if (frame->isMasked) { os_memcpy(&frame->maskingKey, data, sizeof(uint32_t)); data += sizeof(uint32_t); } frame->payloadData = data; }
AT_QUEUE_ERROR_CODE at_queue_get(u8 *element) { at_queue_t *q = &at_queue; u8 winbuf[32]; s32 dcnt; if (q->qcnt <= 0) { if (at_queue_callback != NULL) { dcnt = at_queue_callback(winbuf, sizeof(winbuf)); if (dcnt > 0) { if (dcnt > q->qsize - q->qcnt) { AT_DBG("queue is overflow\n"); } else { s32 i; for (i=0; i < dcnt; i++) { q->qbuf[q->widx++] = winbuf[i]; q->widx = q->widx >= q->qsize ? 0 : q->widx; q->qcnt++; } } } else { return AQEC_EMPTY; } } else { return AQEC_EMPTY; } } *element = q->qbuf[q->ridx++]; q->ridx = q->ridx >= q->qsize ? 0 : q->ridx; q->qcnt--; return AQEC_OK; }