Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Char: moxa, cleanup rx/tx

- cleanup types
- use tty_prepare_flip_string and io memcpys

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Tested-by: Oyvind Aabling <Oyvind.Aabling@uni-c.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Jiri Slaby and committed by
Linus Torvalds
2108eba5 7bcf97d1

+51 -75
+50 -74
drivers/char/moxa.c
··· 224 224 static void MoxaPortFlowCtrl(struct moxa_port *, int, int, int, int, int); 225 225 static int MoxaPortLineStatus(struct moxa_port *); 226 226 static void MoxaPortFlushData(struct moxa_port *, int); 227 - static int MoxaPortWriteData(struct moxa_port *, unsigned char *, int); 227 + static int MoxaPortWriteData(struct moxa_port *, const unsigned char *, int); 228 228 static int MoxaPortReadData(struct moxa_port *); 229 229 static int MoxaPortTxQueue(struct moxa_port *); 230 230 static int MoxaPortRxQueue(struct moxa_port *); ··· 1165 1165 return 0; 1166 1166 1167 1167 spin_lock_bh(&moxa_lock); 1168 - len = MoxaPortWriteData(ch, (unsigned char *) buf, count); 1168 + len = MoxaPortWriteData(ch, buf, count); 1169 1169 spin_unlock_bh(&moxa_lock); 1170 1170 1171 1171 /********************************************* ··· 2030 2030 return val; 2031 2031 } 2032 2032 2033 - static int MoxaPortWriteData(struct moxa_port *port, unsigned char *buffer, 2034 - int len) 2033 + static int MoxaPortWriteData(struct moxa_port *port, 2034 + const unsigned char *buffer, int len) 2035 2035 { 2036 - int c, total, i; 2037 - ushort tail; 2038 - int cnt; 2039 - ushort head, tx_mask, spage, epage; 2040 - ushort pageno, pageofs, bufhead; 2041 2036 void __iomem *baseAddr, *ofsAddr, *ofs; 2037 + unsigned int c, total; 2038 + u16 head, tail, tx_mask, spage, epage; 2039 + u16 pageno, pageofs, bufhead; 2042 2040 2043 2041 ofsAddr = port->tableAddr; 2044 2042 baseAddr = port->board->basemem; ··· 2045 2047 epage = readw(ofsAddr + EndPage_txb); 2046 2048 tail = readw(ofsAddr + TXwptr); 2047 2049 head = readw(ofsAddr + TXrptr); 2048 - c = (head > tail) ? (head - tail - 1) 2049 - : (head - tail + tx_mask); 2050 + c = (head > tail) ? (head - tail - 1) : (head - tail + tx_mask); 2050 2051 if (c > len) 2051 2052 c = len; 2052 2053 moxaLog.txcnt[port->tty->index] += c; ··· 2060 2063 len = tx_mask + 1 - tail; 2061 2064 len = (c > len) ? len : c; 2062 2065 ofs = baseAddr + DynPage_addr + bufhead + tail; 2063 - for (i = 0; i < len; i++) 2064 - writeb(*buffer++, ofs + i); 2066 + memcpy_toio(ofs, buffer, len); 2067 + buffer += len; 2065 2068 tail = (tail + len) & tx_mask; 2066 2069 c -= len; 2067 2070 } 2068 - writew(tail, ofsAddr + TXwptr); 2069 2071 } else { 2070 - len = c; 2071 2072 pageno = spage + (tail >> 13); 2072 2073 pageofs = tail & Page_mask; 2073 - do { 2074 - cnt = Page_size - pageofs; 2075 - if (cnt > c) 2076 - cnt = c; 2077 - c -= cnt; 2074 + while (c > 0) { 2075 + len = Page_size - pageofs; 2076 + if (len > c) 2077 + len = c; 2078 2078 writeb(pageno, baseAddr + Control_reg); 2079 2079 ofs = baseAddr + DynPage_addr + pageofs; 2080 - for (i = 0; i < cnt; i++) 2081 - writeb(*buffer++, ofs + i); 2082 - if (c == 0) { 2083 - writew((tail + len) & tx_mask, ofsAddr + TXwptr); 2084 - break; 2085 - } 2080 + memcpy_toio(ofs, buffer, len); 2081 + buffer += len; 2086 2082 if (++pageno == epage) 2087 2083 pageno = spage; 2088 2084 pageofs = 0; 2089 - } while (1); 2085 + c -= len; 2086 + } 2087 + tail = (tail + total) & tx_mask; 2090 2088 } 2089 + writew(tail, ofsAddr + TXwptr); 2091 2090 writeb(1, ofsAddr + CD180TXirq); /* start to send */ 2092 - return (total); 2091 + return total; 2093 2092 } 2094 2093 2095 2094 static int MoxaPortReadData(struct moxa_port *port) 2096 2095 { 2097 2096 struct tty_struct *tty = port->tty; 2098 - register ushort head, pageofs; 2099 - int i, count, cnt, len, total, remain; 2100 - ushort tail, rx_mask, spage, epage; 2101 - ushort pageno, bufhead; 2097 + unsigned char *dst; 2102 2098 void __iomem *baseAddr, *ofsAddr, *ofs; 2099 + unsigned int count, len, total; 2100 + u16 tail, rx_mask, spage, epage; 2101 + u16 pageno, pageofs, bufhead, head; 2103 2102 2104 2103 ofsAddr = port->tableAddr; 2105 2104 baseAddr = port->board->basemem; ··· 2104 2111 rx_mask = readw(ofsAddr + RX_mask); 2105 2112 spage = readw(ofsAddr + Page_rxb); 2106 2113 epage = readw(ofsAddr + EndPage_rxb); 2107 - count = (tail >= head) ? (tail - head) 2108 - : (tail - head + rx_mask + 1); 2114 + count = (tail >= head) ? (tail - head) : (tail - head + rx_mask + 1); 2109 2115 if (count == 0) 2110 2116 return 0; 2111 2117 2112 2118 total = count; 2113 - remain = count - total; 2114 2119 moxaLog.rxcnt[tty->index] += total; 2115 - count = total; 2116 2120 if (spage == epage) { 2117 2121 bufhead = readw(ofsAddr + Ofs_rxb); 2118 2122 writew(spage, baseAddr + Control_reg); 2119 2123 while (count > 0) { 2120 - if (tail >= head) 2121 - len = tail - head; 2122 - else 2123 - len = rx_mask + 1 - head; 2124 - len = (count > len) ? len : count; 2125 2124 ofs = baseAddr + DynPage_addr + bufhead + head; 2126 - for (i = 0; i < len; i++) 2127 - tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL); 2125 + len = (tail >= head) ? (tail - head) : 2126 + (rx_mask + 1 - head); 2127 + len = tty_prepare_flip_string(tty, &dst, 2128 + min(len, count)); 2129 + memcpy_fromio(dst, ofs, len); 2128 2130 head = (head + len) & rx_mask; 2129 2131 count -= len; 2130 2132 } 2131 - writew(head, ofsAddr + RXrptr); 2132 2133 } else { 2133 - len = count; 2134 2134 pageno = spage + (head >> 13); 2135 2135 pageofs = head & Page_mask; 2136 - do { 2137 - cnt = Page_size - pageofs; 2138 - if (cnt > count) 2139 - cnt = count; 2140 - count -= cnt; 2136 + while (count > 0) { 2141 2137 writew(pageno, baseAddr + Control_reg); 2142 2138 ofs = baseAddr + DynPage_addr + pageofs; 2143 - for (i = 0; i < cnt; i++) 2144 - tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL); 2145 - if (count == 0) { 2146 - writew((head + len) & rx_mask, ofsAddr + RXrptr); 2147 - break; 2148 - } 2149 - if (++pageno == epage) 2139 + len = tty_prepare_flip_string(tty, &dst, 2140 + min(Page_size - pageofs, count)); 2141 + memcpy_fromio(dst, ofs, len); 2142 + 2143 + count -= len; 2144 + pageofs = (pageofs + len) & Page_mask; 2145 + if (pageofs == 0 && ++pageno == epage) 2150 2146 pageno = spage; 2151 - pageofs = 0; 2152 - } while (1); 2147 + } 2148 + head = (head + total) & rx_mask; 2153 2149 } 2154 - if ((readb(ofsAddr + FlagStat) & Xoff_state) && (remain < LowWater)) { 2150 + writew(head, ofsAddr + RXrptr); 2151 + if (readb(ofsAddr + FlagStat) & Xoff_state) { 2155 2152 moxaLowWaterChk = 1; 2156 2153 port->lowChkFlag = 1; 2157 2154 } 2158 - return (total); 2155 + return total; 2159 2156 } 2160 2157 2161 2158 2162 2159 static int MoxaPortTxQueue(struct moxa_port *port) 2163 2160 { 2164 2161 void __iomem *ofsAddr = port->tableAddr; 2165 - ushort rptr, wptr, mask; 2166 - int len; 2162 + u16 rptr, wptr, mask; 2167 2163 2168 2164 rptr = readw(ofsAddr + TXrptr); 2169 2165 wptr = readw(ofsAddr + TXwptr); 2170 2166 mask = readw(ofsAddr + TX_mask); 2171 - len = (wptr - rptr) & mask; 2172 - return (len); 2167 + return (wptr - rptr) & mask; 2173 2168 } 2174 2169 2175 2170 static int MoxaPortTxFree(struct moxa_port *port) 2176 2171 { 2177 2172 void __iomem *ofsAddr = port->tableAddr; 2178 - ushort rptr, wptr, mask; 2179 - int len; 2173 + u16 rptr, wptr, mask; 2180 2174 2181 2175 rptr = readw(ofsAddr + TXrptr); 2182 2176 wptr = readw(ofsAddr + TXwptr); 2183 2177 mask = readw(ofsAddr + TX_mask); 2184 - len = mask - ((wptr - rptr) & mask); 2185 - return (len); 2178 + return mask - ((wptr - rptr) & mask); 2186 2179 } 2187 2180 2188 2181 static int MoxaPortRxQueue(struct moxa_port *port) 2189 2182 { 2190 2183 void __iomem *ofsAddr = port->tableAddr; 2191 - ushort rptr, wptr, mask; 2192 - int len; 2184 + u16 rptr, wptr, mask; 2193 2185 2194 2186 rptr = readw(ofsAddr + RXrptr); 2195 2187 wptr = readw(ofsAddr + RXwptr); 2196 2188 mask = readw(ofsAddr + RX_mask); 2197 - len = (wptr - rptr) & mask; 2198 - return (len); 2189 + return (wptr - rptr) & mask; 2199 2190 } 2200 - 2201 2191 2202 2192 static void MoxaPortTxDisable(struct moxa_port *port) 2203 2193 {
+1 -1
drivers/char/moxa.h
··· 217 217 #define C320p32rx_mask (C320p32rx_size - 1) 218 218 #define C320p32tx_mask (C320p32tx_size - 1) 219 219 220 - #define Page_size 0x2000 220 + #define Page_size 0x2000U 221 221 #define Page_mask (Page_size - 1) 222 222 #define C218rx_spage 3 223 223 #define C218tx_spage 4