Lines Matching refs:bc

145 static inline void baycom_int_freq(struct baycom_state *bc)
152 bc->debug_vals.cur_intcnt++;
153 if (time_after_eq(cur_jiffies, bc->debug_vals.last_jiffies + HZ)) {
154 bc->debug_vals.last_jiffies = cur_jiffies;
155 bc->debug_vals.last_intcnt = bc->debug_vals.cur_intcnt;
156 bc->debug_vals.cur_intcnt = 0;
157 bc->debug_vals.last_pllcorr = bc->debug_vals.cur_pllcorr;
158 bc->debug_vals.cur_pllcorr = 0;
191 static __inline__ void ser12_rx(struct net_device *dev, struct baycom_state *bc, struct timespec64 *ts, unsigned char curs)
194 int bdus8 = bc->baud_us >> 3;
195 int bdus4 = bc->baud_us >> 2;
196 int bdus2 = bc->baud_us >> 1;
199 bc->modem.ser12.pll_time;
203 timediff -= bc->baud_us;
204 bc->modem.ser12.pll_time += bc->baud_us;
205 bc->modem.ser12.dcd_time--;
207 if (bc->modem.shreg & 1) {
208 hdlcdrv_putbits(&bc->hdrv, (bc->modem.shreg >> 1) ^ 0xffff);
209 bc->modem.shreg = 0x10000;
212 bc->modem.shreg >>= 1;
214 if (bc->modem.ser12.dcd_time <= 0) {
215 if (!bc->opt_dcd)
216 hdlcdrv_setdcd(&bc->hdrv, (bc->modem.ser12.dcd_sum0 +
217 bc->modem.ser12.dcd_sum1 +
218 bc->modem.ser12.dcd_sum2) < 0);
219 bc->modem.ser12.dcd_sum2 = bc->modem.ser12.dcd_sum1;
220 bc->modem.ser12.dcd_sum1 = bc->modem.ser12.dcd_sum0;
221 bc->modem.ser12.dcd_sum0 = 2; /* slight bias */
222 bc->modem.ser12.dcd_time += 120;
224 if (bc->modem.ser12.last_rxbit != curs) {
225 bc->modem.ser12.last_rxbit = curs;
226 bc->modem.shreg |= 0x10000;
229 bc->modem.ser12.pll_time += bdus8;
231 bc->modem.ser12.pll_time += 1000000 - bdus8;
234 bc->modem.ser12.dcd_sum0 += 4;
236 bc->modem.ser12.dcd_sum0--;
238 bc->debug_vals.cur_pllcorr = timediff;
241 while (bc->modem.ser12.pll_time >= 1000000)
242 bc->modem.ser12.pll_time -= 1000000;
250 struct baycom_state *bc = netdev_priv(dev);
255 if (!bc || bc->hdrv.magic != HDLCDRV_MAGIC)
264 if ((msr & 8) && bc->opt_dcd)
265 hdlcdrv_setdcd(&bc->hdrv, !((msr ^ bc->opt_dcd) & 0x80));
283 baycom_int_freq(bc);
289 if (bc->modem.ptt)
290 outb(0x0e | (!!bc->modem.ser12.tx_bit), MCR(dev->base_addr));
298 if ((msr & 8) && bc->opt_dcd)
299 hdlcdrv_setdcd(&bc->hdrv, !((msr ^ bc->opt_dcd) & 0x80));
304 ser12_rx(dev, bc, &ts, msr & 0x10); /* CTS */
305 if (bc->modem.ptt && txcount) {
306 if (bc->modem.ser12.txshreg <= 1) {
307 bc->modem.ser12.txshreg = 0x10000 | hdlcdrv_getbits(&bc->hdrv);
308 if (!hdlcdrv_ptt(&bc->hdrv)) {
310 bc->modem.ptt = 0;
314 bc->modem.ser12.tx_bit = !(bc->modem.ser12.tx_bit ^ (bc->modem.ser12.txshreg & 1));
315 bc->modem.ser12.txshreg >>= 1;
319 if (!bc->modem.ptt && txcount) {
320 hdlcdrv_arbitrate(dev, &bc->hdrv);
321 if (hdlcdrv_ptt(&bc->hdrv)) {
322 ser12_set_divisor(dev, bc->baud_uartdiv);
323 bc->modem.ser12.txshreg = 1;
324 bc->modem.ptt = 1;
327 hdlcdrv_transmitter(dev, &bc->hdrv);
328 hdlcdrv_receiver(dev, &bc->hdrv);
376 struct baycom_state *bc = netdev_priv(dev);
379 if (!dev || !bc)
388 if (bc->baud < 300 || bc->baud > 4800) {
398 memset(&bc->modem, 0, sizeof(bc->modem));
399 bc->hdrv.par.bitrate = bc->baud;
400 bc->baud_us = 1000000/bc->baud;
401 bc->baud_uartdiv = (115200/8)/bc->baud;
432 hdlcdrv_setdcd(&bc->hdrv, 0);
434 bc_drvname, dev->base_addr, dev->irq, bc->baud, uart_str[u]);
442 struct baycom_state *bc = netdev_priv(dev);
444 if (!dev || !bc)
480 static int baycom_setmode(struct baycom_state *bc, const char *modestr)
487 bc->baud = baud*100;
490 bc->opt_dcd = 0;
492 bc->opt_dcd = -1;
494 bc->opt_dcd = 1;
503 struct baycom_state *bc;
509 bc = netdev_priv(dev);
510 BUG_ON(bc->hdrv.magic != HDLCDRV_MAGIC);
519 sprintf(hi->data.modename, "ser%u", bc->baud / 100);
520 if (bc->opt_dcd <= 0)
521 strcat(hi->data.modename, (!bc->opt_dcd) ? "*" : "+");
530 return baycom_setmode(bc, hi->data.modename);
551 bi.data.dbg.debug1 = bc->hdrv.ptt_keyed;
552 bi.data.dbg.debug2 = bc->debug_vals.last_intcnt;
553 bi.data.dbg.debug3 = bc->debug_vals.last_pllcorr;
600 struct baycom_state *bc;
616 bc = netdev_priv(dev);
617 if (set_hw && baycom_setmode(bc, mode[i]))
619 bc->baud = baud[i];