|
@@ -303,7 +303,7 @@ struct slgt_info {
|
|
u32 idle_mode;
|
|
u32 idle_mode;
|
|
u32 max_frame_size; /* as set by device config */
|
|
u32 max_frame_size; /* as set by device config */
|
|
|
|
|
|
- unsigned int raw_rx_size;
|
|
|
|
|
|
+ unsigned int rbuf_fill_level;
|
|
unsigned int if_mode;
|
|
unsigned int if_mode;
|
|
|
|
|
|
/* device status */
|
|
/* device status */
|
|
@@ -2676,8 +2676,29 @@ static int tx_abort(struct slgt_info *info)
|
|
static int rx_enable(struct slgt_info *info, int enable)
|
|
static int rx_enable(struct slgt_info *info, int enable)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
- DBGINFO(("%s rx_enable(%d)\n", info->device_name, enable));
|
|
|
|
|
|
+ unsigned int rbuf_fill_level;
|
|
|
|
+ DBGINFO(("%s rx_enable(%08x)\n", info->device_name, enable));
|
|
spin_lock_irqsave(&info->lock,flags);
|
|
spin_lock_irqsave(&info->lock,flags);
|
|
|
|
+ /*
|
|
|
|
+ * enable[31..16] = receive DMA buffer fill level
|
|
|
|
+ * 0 = noop (leave fill level unchanged)
|
|
|
|
+ * fill level must be multiple of 4 and <= buffer size
|
|
|
|
+ */
|
|
|
|
+ rbuf_fill_level = ((unsigned int)enable) >> 16;
|
|
|
|
+ if (rbuf_fill_level) {
|
|
|
|
+ if ((rbuf_fill_level > DMABUFSIZE) || (rbuf_fill_level % 4))
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ info->rbuf_fill_level = rbuf_fill_level;
|
|
|
|
+ rx_stop(info); /* restart receiver to use new fill level */
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * enable[1..0] = receiver enable command
|
|
|
|
+ * 0 = disable
|
|
|
|
+ * 1 = enable
|
|
|
|
+ * 2 = enable or force hunt mode if already enabled
|
|
|
|
+ */
|
|
|
|
+ enable &= 3;
|
|
if (enable) {
|
|
if (enable) {
|
|
if (!info->rx_enabled)
|
|
if (!info->rx_enabled)
|
|
rx_start(info);
|
|
rx_start(info);
|
|
@@ -3444,7 +3465,7 @@ static struct slgt_info *alloc_dev(int adapter_num, int port_num, struct pci_dev
|
|
info->magic = MGSL_MAGIC;
|
|
info->magic = MGSL_MAGIC;
|
|
INIT_WORK(&info->task, bh_handler);
|
|
INIT_WORK(&info->task, bh_handler);
|
|
info->max_frame_size = 4096;
|
|
info->max_frame_size = 4096;
|
|
- info->raw_rx_size = DMABUFSIZE;
|
|
|
|
|
|
+ info->rbuf_fill_level = DMABUFSIZE;
|
|
info->port.close_delay = 5*HZ/10;
|
|
info->port.close_delay = 5*HZ/10;
|
|
info->port.closing_wait = 30*HZ;
|
|
info->port.closing_wait = 30*HZ;
|
|
init_waitqueue_head(&info->status_event_wait_q);
|
|
init_waitqueue_head(&info->status_event_wait_q);
|
|
@@ -4447,16 +4468,7 @@ static void free_rbufs(struct slgt_info *info, unsigned int i, unsigned int last
|
|
while(!done) {
|
|
while(!done) {
|
|
/* reset current buffer for reuse */
|
|
/* reset current buffer for reuse */
|
|
info->rbufs[i].status = 0;
|
|
info->rbufs[i].status = 0;
|
|
- switch(info->params.mode) {
|
|
|
|
- case MGSL_MODE_RAW:
|
|
|
|
- case MGSL_MODE_MONOSYNC:
|
|
|
|
- case MGSL_MODE_BISYNC:
|
|
|
|
- set_desc_count(info->rbufs[i], info->raw_rx_size);
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- set_desc_count(info->rbufs[i], DMABUFSIZE);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ set_desc_count(info->rbufs[i], info->rbuf_fill_level);
|
|
if (i == last)
|
|
if (i == last)
|
|
done = 1;
|
|
done = 1;
|
|
if (++i == info->rbuf_count)
|
|
if (++i == info->rbuf_count)
|
|
@@ -4563,7 +4575,7 @@ check_again:
|
|
|
|
|
|
DBGBH(("%s rx frame status=%04X size=%d\n",
|
|
DBGBH(("%s rx frame status=%04X size=%d\n",
|
|
info->device_name, status, framesize));
|
|
info->device_name, status, framesize));
|
|
- DBGDATA(info, info->rbufs[start].buf, min_t(int, framesize, DMABUFSIZE), "rx");
|
|
|
|
|
|
+ DBGDATA(info, info->rbufs[start].buf, min_t(int, framesize, info->rbuf_fill_level), "rx");
|
|
|
|
|
|
if (framesize) {
|
|
if (framesize) {
|
|
if (!(info->params.crc_type & HDLC_CRC_RETURN_EX)) {
|
|
if (!(info->params.crc_type & HDLC_CRC_RETURN_EX)) {
|
|
@@ -4583,7 +4595,7 @@ check_again:
|
|
info->icount.rxok++;
|
|
info->icount.rxok++;
|
|
|
|
|
|
while(copy_count) {
|
|
while(copy_count) {
|
|
- int partial_count = min(copy_count, DMABUFSIZE);
|
|
|
|
|
|
+ int partial_count = min_t(int, copy_count, info->rbuf_fill_level);
|
|
memcpy(p, info->rbufs[i].buf, partial_count);
|
|
memcpy(p, info->rbufs[i].buf, partial_count);
|
|
p += partial_count;
|
|
p += partial_count;
|
|
copy_count -= partial_count;
|
|
copy_count -= partial_count;
|