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

powerpc/hvsi: Fix endian issues in HVSI driver

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

+20 -21
+8 -8
arch/powerpc/include/asm/hvsi.h
··· 25 25 struct hvsi_header { 26 26 uint8_t type; 27 27 uint8_t len; 28 - uint16_t seqno; 28 + __be16 seqno; 29 29 } __attribute__((packed)); 30 30 31 31 struct hvsi_data { ··· 35 35 36 36 struct hvsi_control { 37 37 struct hvsi_header hdr; 38 - uint16_t verb; 38 + __be16 verb; 39 39 /* optional depending on verb: */ 40 - uint32_t word; 41 - uint32_t mask; 40 + __be32 word; 41 + __be32 mask; 42 42 } __attribute__((packed)); 43 43 44 44 struct hvsi_query { 45 45 struct hvsi_header hdr; 46 - uint16_t verb; 46 + __be16 verb; 47 47 } __attribute__((packed)); 48 48 49 49 struct hvsi_query_response { 50 50 struct hvsi_header hdr; 51 - uint16_t verb; 52 - uint16_t query_seqno; 51 + __be16 verb; 52 + __be16 query_seqno; 53 53 union { 54 54 uint8_t version; 55 - uint32_t mctrl_word; 55 + __be32 mctrl_word; 56 56 } u; 57 57 } __attribute__((packed)); 58 58
+12 -13
drivers/tty/hvc/hvsi_lib.c
··· 9 9 10 10 static int hvsi_send_packet(struct hvsi_priv *pv, struct hvsi_header *packet) 11 11 { 12 - packet->seqno = atomic_inc_return(&pv->seqno); 12 + packet->seqno = cpu_to_be16(atomic_inc_return(&pv->seqno)); 13 13 14 14 /* Assumes that always succeeds, works in practice */ 15 15 return pv->put_chars(pv->termno, (char *)packet, packet->len); ··· 28 28 /* Send version query */ 29 29 q.hdr.type = VS_QUERY_PACKET_HEADER; 30 30 q.hdr.len = sizeof(struct hvsi_query); 31 - q.verb = VSV_SEND_VERSION_NUMBER; 31 + q.verb = cpu_to_be16(VSV_SEND_VERSION_NUMBER); 32 32 hvsi_send_packet(pv, &q.hdr); 33 33 } 34 34 ··· 40 40 41 41 ctrl.hdr.type = VS_CONTROL_PACKET_HEADER; 42 42 ctrl.hdr.len = sizeof(struct hvsi_control); 43 - ctrl.verb = VSV_CLOSE_PROTOCOL; 43 + ctrl.verb = cpu_to_be16(VSV_CLOSE_PROTOCOL); 44 44 return hvsi_send_packet(pv, &ctrl.hdr); 45 45 } 46 46 ··· 69 69 { 70 70 struct hvsi_control *pkt = (struct hvsi_control *)pv->inbuf; 71 71 72 - switch (pkt->verb) { 72 + switch (be16_to_cpu(pkt->verb)) { 73 73 case VSV_CLOSE_PROTOCOL: 74 74 /* We restart the handshaking */ 75 75 hvsi_start_handshake(pv); 76 76 break; 77 77 case VSV_MODEM_CTL_UPDATE: 78 78 /* Transition of carrier detect */ 79 - hvsi_cd_change(pv, pkt->word & HVSI_TSCD); 79 + hvsi_cd_change(pv, be32_to_cpu(pkt->word) & HVSI_TSCD); 80 80 break; 81 81 } 82 82 } ··· 87 87 struct hvsi_query_response r; 88 88 89 89 /* We only handle version queries */ 90 - if (pkt->verb != VSV_SEND_VERSION_NUMBER) 90 + if (be16_to_cpu(pkt->verb) != VSV_SEND_VERSION_NUMBER) 91 91 return; 92 92 93 93 pr_devel("HVSI@%x: Got version query, sending response...\n", ··· 96 96 /* Send version response */ 97 97 r.hdr.type = VS_QUERY_RESPONSE_PACKET_HEADER; 98 98 r.hdr.len = sizeof(struct hvsi_query_response); 99 - r.verb = VSV_SEND_VERSION_NUMBER; 99 + r.verb = cpu_to_be16(VSV_SEND_VERSION_NUMBER); 100 100 r.u.version = HVSI_VERSION; 101 101 r.query_seqno = pkt->hdr.seqno; 102 102 hvsi_send_packet(pv, &r.hdr); ··· 112 112 113 113 switch(r->verb) { 114 114 case VSV_SEND_MODEM_CTL_STATUS: 115 - hvsi_cd_change(pv, r->u.mctrl_word & HVSI_TSCD); 115 + hvsi_cd_change(pv, be32_to_cpu(r->u.mctrl_word) & HVSI_TSCD); 116 116 pv->mctrl_update = 1; 117 117 break; 118 118 } ··· 265 265 pv->mctrl_update = 0; 266 266 q.hdr.type = VS_QUERY_PACKET_HEADER; 267 267 q.hdr.len = sizeof(struct hvsi_query); 268 - q.hdr.seqno = atomic_inc_return(&pv->seqno); 269 - q.verb = VSV_SEND_MODEM_CTL_STATUS; 268 + q.verb = cpu_to_be16(VSV_SEND_MODEM_CTL_STATUS); 270 269 rc = hvsi_send_packet(pv, &q.hdr); 271 270 if (rc <= 0) { 272 271 pr_devel("HVSI@%x: Error %d...\n", pv->termno, rc); ··· 303 304 304 305 ctrl.hdr.type = VS_CONTROL_PACKET_HEADER, 305 306 ctrl.hdr.len = sizeof(struct hvsi_control); 306 - ctrl.verb = VSV_SET_MODEM_CTL; 307 - ctrl.mask = HVSI_TSDTR; 308 - ctrl.word = dtr ? HVSI_TSDTR : 0; 307 + ctrl.verb = cpu_to_be16(VSV_SET_MODEM_CTL); 308 + ctrl.mask = cpu_to_be32(HVSI_TSDTR); 309 + ctrl.word = cpu_to_be32(dtr ? HVSI_TSDTR : 0); 309 310 return hvsi_send_packet(pv, &ctrl.hdr); 310 311 } 311 312