| /* |
| * Copyright (c) 2011 Mindspeed Technologies, Inc. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2 |
| * of the License, or (at your option) any later version. |
| |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| * |
| * |
| */ |
| |
| #include "module_Rx.h" |
| #include "module_hidrv.h" |
| |
| #ifdef CFG_LRO |
| static U8 CLASS_DMEM_SH(lro_enable); |
| #endif |
| |
| static U16 M_rx_cmdproc(U16 cmd_code, U16 cmd_len, U16 *pcmd) |
| { |
| U32 portid; |
| U16 acklen; |
| U16 ackstatus; |
| U8 enable; |
| #ifdef CFG_LRO |
| int id; |
| struct pfe_ctrl *ctrl = &pfe->ctrl; |
| #endif |
| |
| acklen = 2; |
| ackstatus = CMD_OK; |
| |
| switch (cmd_code) |
| { |
| case CMD_RX_ENABLE: |
| portid = (U8)*pcmd; |
| if (portid >= GEM_PORTS) { |
| ackstatus = CMD_ERR; |
| break; |
| } |
| |
| // M_expt_rx_enable(portid); |
| // M_rx_enable(portid); |
| break; |
| |
| case CMD_RX_DISABLE: |
| portid = (U8)*pcmd; |
| if (portid >= GEM_PORTS) { |
| ackstatus = CMD_ERR; |
| break; |
| } |
| |
| // M_rx_disable(portid); |
| // M_expt_rx_disable(portid); |
| break; |
| |
| case CMD_RX_LRO: |
| enable = (U8)*pcmd; |
| |
| #ifdef CFG_LRO |
| if (enable > 1) { |
| ackstatus = CMD_ERR; |
| break; |
| } |
| |
| if (pe_sync_stop(ctrl, CLASS_MASK) < 0) { |
| ackstatus = CMD_ERR; |
| break; |
| } |
| |
| /* update the DMEM in class-pe */ |
| for (id = CLASS0_ID; id <= CLASS_MAX_ID; id++){ |
| pe_dmem_writeb(id, enable, virt_to_class_dmem(&lro_enable)); |
| } |
| |
| pe_start(ctrl, CLASS_MASK); |
| #else |
| if (enable > 0) |
| ackstatus = CMD_ERR; |
| #endif |
| |
| break; |
| |
| default: |
| ackstatus = CMD_ERR; |
| break; |
| } |
| |
| *pcmd = ackstatus; |
| return acklen; |
| } |
| |
| |
| int rx_init(void) |
| { |
| set_cmd_handler(EVENT_PKT_RX, M_rx_cmdproc); |
| |
| ff_enable = 1; |
| |
| return 0; |
| } |
| |
| void rx_exit(void) |
| { |
| |
| } |