Commit 2108eba5c531c12f5ae2ed2ef4cee7bf4246897b
Committed by
Linus Torvalds
1 parent
7bcf97d1dd
Exists in
master
and in
39 other branches
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>
Showing 2 changed files with 51 additions and 75 deletions Side-by-side Diff
drivers/char/moxa.c
... | ... | @@ -224,7 +224,7 @@ |
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,7 +1165,7 @@ |
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 | /********************************************* |
1172 | 1172 | |
1173 | 1173 | |
... | ... | @@ -2030,15 +2030,13 @@ |
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; |
... | ... | @@ -2047,8 +2045,7 @@ |
2047 | 2045 | epage = readw(ofsAddr + EndPage_txb); |
2048 | 2046 | tail = readw(ofsAddr + TXwptr); |
2049 | 2047 | head = readw(ofsAddr + TXrptr); |
2050 | - c = (head > tail) ? (head - tail - 1) | |
2051 | - : (head - tail + tx_mask); | |
2048 | + c = (head > tail) ? (head - tail - 1) : (head - tail + tx_mask); | |
2052 | 2049 | if (c > len) |
2053 | 2050 | c = len; |
2054 | 2051 | moxaLog.txcnt[port->tty->index] += c; |
2055 | 2052 | |
2056 | 2053 | |
2057 | 2054 | |
2058 | 2055 | |
2059 | 2056 | |
2060 | 2057 | |
2061 | 2058 | |
2062 | 2059 | |
2063 | 2060 | |
... | ... | @@ -2063,46 +2060,42 @@ |
2063 | 2060 | len = tx_mask + 1 - tail; |
2064 | 2061 | len = (c > len) ? len : c; |
2065 | 2062 | ofs = baseAddr + DynPage_addr + bufhead + tail; |
2066 | - for (i = 0; i < len; i++) | |
2067 | - writeb(*buffer++, ofs + i); | |
2063 | + memcpy_toio(ofs, buffer, len); | |
2064 | + buffer += len; | |
2068 | 2065 | tail = (tail + len) & tx_mask; |
2069 | 2066 | c -= len; |
2070 | 2067 | } |
2071 | - writew(tail, ofsAddr + TXwptr); | |
2072 | 2068 | } else { |
2073 | - len = c; | |
2074 | 2069 | pageno = spage + (tail >> 13); |
2075 | 2070 | pageofs = tail & Page_mask; |
2076 | - do { | |
2077 | - cnt = Page_size - pageofs; | |
2078 | - if (cnt > c) | |
2079 | - cnt = c; | |
2080 | - c -= cnt; | |
2071 | + while (c > 0) { | |
2072 | + len = Page_size - pageofs; | |
2073 | + if (len > c) | |
2074 | + len = c; | |
2081 | 2075 | writeb(pageno, baseAddr + Control_reg); |
2082 | 2076 | ofs = baseAddr + DynPage_addr + pageofs; |
2083 | - for (i = 0; i < cnt; i++) | |
2084 | - writeb(*buffer++, ofs + i); | |
2085 | - if (c == 0) { | |
2086 | - writew((tail + len) & tx_mask, ofsAddr + TXwptr); | |
2087 | - break; | |
2088 | - } | |
2077 | + memcpy_toio(ofs, buffer, len); | |
2078 | + buffer += len; | |
2089 | 2079 | if (++pageno == epage) |
2090 | 2080 | pageno = spage; |
2091 | 2081 | pageofs = 0; |
2092 | - } while (1); | |
2082 | + c -= len; | |
2083 | + } | |
2084 | + tail = (tail + total) & tx_mask; | |
2093 | 2085 | } |
2086 | + writew(tail, ofsAddr + TXwptr); | |
2094 | 2087 | writeb(1, ofsAddr + CD180TXirq); /* start to send */ |
2095 | - return (total); | |
2088 | + return total; | |
2096 | 2089 | } |
2097 | 2090 | |
2098 | 2091 | static int MoxaPortReadData(struct moxa_port *port) |
2099 | 2092 | { |
2100 | 2093 | struct tty_struct *tty = port->tty; |
2101 | - register ushort head, pageofs; | |
2102 | - int i, count, cnt, len, total, remain; | |
2103 | - ushort tail, rx_mask, spage, epage; | |
2104 | - ushort pageno, bufhead; | |
2094 | + unsigned char *dst; | |
2105 | 2095 | void __iomem *baseAddr, *ofsAddr, *ofs; |
2096 | + unsigned int count, len, total; | |
2097 | + u16 tail, rx_mask, spage, epage; | |
2098 | + u16 pageno, pageofs, bufhead, head; | |
2106 | 2099 | |
2107 | 2100 | ofsAddr = port->tableAddr; |
2108 | 2101 | baseAddr = port->board->basemem; |
2109 | 2102 | |
2110 | 2103 | |
2111 | 2104 | |
2112 | 2105 | |
2113 | 2106 | |
2114 | 2107 | |
2115 | 2108 | |
2116 | 2109 | |
2117 | 2110 | |
2118 | 2111 | |
2119 | 2112 | |
2120 | 2113 | |
2121 | 2114 | |
2122 | 2115 | |
2123 | 2116 | |
2124 | 2117 | |
2125 | 2118 | |
2126 | 2119 | |
... | ... | @@ -2111,100 +2104,83 @@ |
2111 | 2104 | rx_mask = readw(ofsAddr + RX_mask); |
2112 | 2105 | spage = readw(ofsAddr + Page_rxb); |
2113 | 2106 | epage = readw(ofsAddr + EndPage_rxb); |
2114 | - count = (tail >= head) ? (tail - head) | |
2115 | - : (tail - head + rx_mask + 1); | |
2107 | + count = (tail >= head) ? (tail - head) : (tail - head + rx_mask + 1); | |
2116 | 2108 | if (count == 0) |
2117 | 2109 | return 0; |
2118 | 2110 | |
2119 | 2111 | total = count; |
2120 | - remain = count - total; | |
2121 | 2112 | moxaLog.rxcnt[tty->index] += total; |
2122 | - count = total; | |
2123 | 2113 | if (spage == epage) { |
2124 | 2114 | bufhead = readw(ofsAddr + Ofs_rxb); |
2125 | 2115 | writew(spage, baseAddr + Control_reg); |
2126 | 2116 | while (count > 0) { |
2127 | - if (tail >= head) | |
2128 | - len = tail - head; | |
2129 | - else | |
2130 | - len = rx_mask + 1 - head; | |
2131 | - len = (count > len) ? len : count; | |
2132 | 2117 | ofs = baseAddr + DynPage_addr + bufhead + head; |
2133 | - for (i = 0; i < len; i++) | |
2134 | - tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL); | |
2118 | + len = (tail >= head) ? (tail - head) : | |
2119 | + (rx_mask + 1 - head); | |
2120 | + len = tty_prepare_flip_string(tty, &dst, | |
2121 | + min(len, count)); | |
2122 | + memcpy_fromio(dst, ofs, len); | |
2135 | 2123 | head = (head + len) & rx_mask; |
2136 | 2124 | count -= len; |
2137 | 2125 | } |
2138 | - writew(head, ofsAddr + RXrptr); | |
2139 | 2126 | } else { |
2140 | - len = count; | |
2141 | 2127 | pageno = spage + (head >> 13); |
2142 | 2128 | pageofs = head & Page_mask; |
2143 | - do { | |
2144 | - cnt = Page_size - pageofs; | |
2145 | - if (cnt > count) | |
2146 | - cnt = count; | |
2147 | - count -= cnt; | |
2129 | + while (count > 0) { | |
2148 | 2130 | writew(pageno, baseAddr + Control_reg); |
2149 | 2131 | ofs = baseAddr + DynPage_addr + pageofs; |
2150 | - for (i = 0; i < cnt; i++) | |
2151 | - tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL); | |
2152 | - if (count == 0) { | |
2153 | - writew((head + len) & rx_mask, ofsAddr + RXrptr); | |
2154 | - break; | |
2155 | - } | |
2156 | - if (++pageno == epage) | |
2132 | + len = tty_prepare_flip_string(tty, &dst, | |
2133 | + min(Page_size - pageofs, count)); | |
2134 | + memcpy_fromio(dst, ofs, len); | |
2135 | + | |
2136 | + count -= len; | |
2137 | + pageofs = (pageofs + len) & Page_mask; | |
2138 | + if (pageofs == 0 && ++pageno == epage) | |
2157 | 2139 | pageno = spage; |
2158 | - pageofs = 0; | |
2159 | - } while (1); | |
2140 | + } | |
2141 | + head = (head + total) & rx_mask; | |
2160 | 2142 | } |
2161 | - if ((readb(ofsAddr + FlagStat) & Xoff_state) && (remain < LowWater)) { | |
2143 | + writew(head, ofsAddr + RXrptr); | |
2144 | + if (readb(ofsAddr + FlagStat) & Xoff_state) { | |
2162 | 2145 | moxaLowWaterChk = 1; |
2163 | 2146 | port->lowChkFlag = 1; |
2164 | 2147 | } |
2165 | - return (total); | |
2148 | + return total; | |
2166 | 2149 | } |
2167 | 2150 | |
2168 | 2151 | |
2169 | 2152 | static int MoxaPortTxQueue(struct moxa_port *port) |
2170 | 2153 | { |
2171 | 2154 | void __iomem *ofsAddr = port->tableAddr; |
2172 | - ushort rptr, wptr, mask; | |
2173 | - int len; | |
2155 | + u16 rptr, wptr, mask; | |
2174 | 2156 | |
2175 | 2157 | rptr = readw(ofsAddr + TXrptr); |
2176 | 2158 | wptr = readw(ofsAddr + TXwptr); |
2177 | 2159 | mask = readw(ofsAddr + TX_mask); |
2178 | - len = (wptr - rptr) & mask; | |
2179 | - return (len); | |
2160 | + return (wptr - rptr) & mask; | |
2180 | 2161 | } |
2181 | 2162 | |
2182 | 2163 | static int MoxaPortTxFree(struct moxa_port *port) |
2183 | 2164 | { |
2184 | 2165 | void __iomem *ofsAddr = port->tableAddr; |
2185 | - ushort rptr, wptr, mask; | |
2186 | - int len; | |
2166 | + u16 rptr, wptr, mask; | |
2187 | 2167 | |
2188 | 2168 | rptr = readw(ofsAddr + TXrptr); |
2189 | 2169 | wptr = readw(ofsAddr + TXwptr); |
2190 | 2170 | mask = readw(ofsAddr + TX_mask); |
2191 | - len = mask - ((wptr - rptr) & mask); | |
2192 | - return (len); | |
2171 | + return mask - ((wptr - rptr) & mask); | |
2193 | 2172 | } |
2194 | 2173 | |
2195 | 2174 | static int MoxaPortRxQueue(struct moxa_port *port) |
2196 | 2175 | { |
2197 | 2176 | void __iomem *ofsAddr = port->tableAddr; |
2198 | - ushort rptr, wptr, mask; | |
2199 | - int len; | |
2177 | + u16 rptr, wptr, mask; | |
2200 | 2178 | |
2201 | 2179 | rptr = readw(ofsAddr + RXrptr); |
2202 | 2180 | wptr = readw(ofsAddr + RXwptr); |
2203 | 2181 | mask = readw(ofsAddr + RX_mask); |
2204 | - len = (wptr - rptr) & mask; | |
2205 | - return (len); | |
2182 | + return (wptr - rptr) & mask; | |
2206 | 2183 | } |
2207 | - | |
2208 | 2184 | |
2209 | 2185 | static void MoxaPortTxDisable(struct moxa_port *port) |
2210 | 2186 | { |
drivers/char/moxa.h
... | ... | @@ -217,7 +217,7 @@ |
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 |