10c0d06caSMauro Carvalho Chehab /* 20c0d06caSMauro Carvalho Chehab * 30c0d06caSMauro Carvalho Chehab * 40c0d06caSMauro Carvalho Chehab * Copyright (C) 2005 Mike Isely <isely@pobox.com> 50c0d06caSMauro Carvalho Chehab * 60c0d06caSMauro Carvalho Chehab * This program is free software; you can redistribute it and/or modify 70c0d06caSMauro Carvalho Chehab * it under the terms of the GNU General Public License as published by 80c0d06caSMauro Carvalho Chehab * the Free Software Foundation; either version 2 of the License 90c0d06caSMauro Carvalho Chehab * 100c0d06caSMauro Carvalho Chehab * This program is distributed in the hope that it will be useful, 110c0d06caSMauro Carvalho Chehab * but WITHOUT ANY WARRANTY; without even the implied warranty of 120c0d06caSMauro Carvalho Chehab * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 130c0d06caSMauro Carvalho Chehab * GNU General Public License for more details. 140c0d06caSMauro Carvalho Chehab * 150c0d06caSMauro Carvalho Chehab * You should have received a copy of the GNU General Public License 160c0d06caSMauro Carvalho Chehab * along with this program; if not, write to the Free Software 170c0d06caSMauro Carvalho Chehab * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 180c0d06caSMauro Carvalho Chehab * 190c0d06caSMauro Carvalho Chehab */ 200c0d06caSMauro Carvalho Chehab 210c0d06caSMauro Carvalho Chehab #include <linux/string.h> 220c0d06caSMauro Carvalho Chehab #include "pvrusb2-debugifc.h" 230c0d06caSMauro Carvalho Chehab #include "pvrusb2-hdw.h" 240c0d06caSMauro Carvalho Chehab #include "pvrusb2-debug.h" 250c0d06caSMauro Carvalho Chehab 260c0d06caSMauro Carvalho Chehab struct debugifc_mask_item { 270c0d06caSMauro Carvalho Chehab const char *name; 280c0d06caSMauro Carvalho Chehab unsigned long msk; 290c0d06caSMauro Carvalho Chehab }; 300c0d06caSMauro Carvalho Chehab 310c0d06caSMauro Carvalho Chehab 320c0d06caSMauro Carvalho Chehab static unsigned int debugifc_count_whitespace(const char *buf, 330c0d06caSMauro Carvalho Chehab unsigned int count) 340c0d06caSMauro Carvalho Chehab { 350c0d06caSMauro Carvalho Chehab unsigned int scnt; 360c0d06caSMauro Carvalho Chehab char ch; 370c0d06caSMauro Carvalho Chehab 380c0d06caSMauro Carvalho Chehab for (scnt = 0; scnt < count; scnt++) { 390c0d06caSMauro Carvalho Chehab ch = buf[scnt]; 400c0d06caSMauro Carvalho Chehab if (ch == ' ') continue; 410c0d06caSMauro Carvalho Chehab if (ch == '\t') continue; 420c0d06caSMauro Carvalho Chehab if (ch == '\n') continue; 430c0d06caSMauro Carvalho Chehab break; 440c0d06caSMauro Carvalho Chehab } 450c0d06caSMauro Carvalho Chehab return scnt; 460c0d06caSMauro Carvalho Chehab } 470c0d06caSMauro Carvalho Chehab 480c0d06caSMauro Carvalho Chehab 490c0d06caSMauro Carvalho Chehab static unsigned int debugifc_count_nonwhitespace(const char *buf, 500c0d06caSMauro Carvalho Chehab unsigned int count) 510c0d06caSMauro Carvalho Chehab { 520c0d06caSMauro Carvalho Chehab unsigned int scnt; 530c0d06caSMauro Carvalho Chehab char ch; 540c0d06caSMauro Carvalho Chehab 550c0d06caSMauro Carvalho Chehab for (scnt = 0; scnt < count; scnt++) { 560c0d06caSMauro Carvalho Chehab ch = buf[scnt]; 570c0d06caSMauro Carvalho Chehab if (ch == ' ') break; 580c0d06caSMauro Carvalho Chehab if (ch == '\t') break; 590c0d06caSMauro Carvalho Chehab if (ch == '\n') break; 600c0d06caSMauro Carvalho Chehab } 610c0d06caSMauro Carvalho Chehab return scnt; 620c0d06caSMauro Carvalho Chehab } 630c0d06caSMauro Carvalho Chehab 640c0d06caSMauro Carvalho Chehab 650c0d06caSMauro Carvalho Chehab static unsigned int debugifc_isolate_word(const char *buf,unsigned int count, 660c0d06caSMauro Carvalho Chehab const char **wstrPtr, 670c0d06caSMauro Carvalho Chehab unsigned int *wlenPtr) 680c0d06caSMauro Carvalho Chehab { 690c0d06caSMauro Carvalho Chehab const char *wptr; 700c0d06caSMauro Carvalho Chehab unsigned int consume_cnt = 0; 710c0d06caSMauro Carvalho Chehab unsigned int wlen; 720c0d06caSMauro Carvalho Chehab unsigned int scnt; 730c0d06caSMauro Carvalho Chehab 740c0d06caSMauro Carvalho Chehab wptr = NULL; 750c0d06caSMauro Carvalho Chehab wlen = 0; 760c0d06caSMauro Carvalho Chehab scnt = debugifc_count_whitespace(buf,count); 770c0d06caSMauro Carvalho Chehab consume_cnt += scnt; count -= scnt; buf += scnt; 780c0d06caSMauro Carvalho Chehab if (!count) goto done; 790c0d06caSMauro Carvalho Chehab 800c0d06caSMauro Carvalho Chehab scnt = debugifc_count_nonwhitespace(buf,count); 810c0d06caSMauro Carvalho Chehab if (!scnt) goto done; 820c0d06caSMauro Carvalho Chehab wptr = buf; 830c0d06caSMauro Carvalho Chehab wlen = scnt; 840c0d06caSMauro Carvalho Chehab consume_cnt += scnt; count -= scnt; buf += scnt; 850c0d06caSMauro Carvalho Chehab 860c0d06caSMauro Carvalho Chehab done: 870c0d06caSMauro Carvalho Chehab *wstrPtr = wptr; 880c0d06caSMauro Carvalho Chehab *wlenPtr = wlen; 890c0d06caSMauro Carvalho Chehab return consume_cnt; 900c0d06caSMauro Carvalho Chehab } 910c0d06caSMauro Carvalho Chehab 920c0d06caSMauro Carvalho Chehab 930c0d06caSMauro Carvalho Chehab static int debugifc_parse_unsigned_number(const char *buf,unsigned int count, 940c0d06caSMauro Carvalho Chehab u32 *num_ptr) 950c0d06caSMauro Carvalho Chehab { 960c0d06caSMauro Carvalho Chehab u32 result = 0; 970c0d06caSMauro Carvalho Chehab int radix = 10; 980c0d06caSMauro Carvalho Chehab if ((count >= 2) && (buf[0] == '0') && 990c0d06caSMauro Carvalho Chehab ((buf[1] == 'x') || (buf[1] == 'X'))) { 1000c0d06caSMauro Carvalho Chehab radix = 16; 1010c0d06caSMauro Carvalho Chehab count -= 2; 1020c0d06caSMauro Carvalho Chehab buf += 2; 1030c0d06caSMauro Carvalho Chehab } else if ((count >= 1) && (buf[0] == '0')) { 1040c0d06caSMauro Carvalho Chehab radix = 8; 1050c0d06caSMauro Carvalho Chehab } 1060c0d06caSMauro Carvalho Chehab 1070c0d06caSMauro Carvalho Chehab while (count--) { 1080c0d06caSMauro Carvalho Chehab int val = hex_to_bin(*buf++); 1090c0d06caSMauro Carvalho Chehab if (val < 0 || val >= radix) 1100c0d06caSMauro Carvalho Chehab return -EINVAL; 1110c0d06caSMauro Carvalho Chehab result *= radix; 1120c0d06caSMauro Carvalho Chehab result += val; 1130c0d06caSMauro Carvalho Chehab } 1140c0d06caSMauro Carvalho Chehab *num_ptr = result; 1150c0d06caSMauro Carvalho Chehab return 0; 1160c0d06caSMauro Carvalho Chehab } 1170c0d06caSMauro Carvalho Chehab 1180c0d06caSMauro Carvalho Chehab 1190c0d06caSMauro Carvalho Chehab static int debugifc_match_keyword(const char *buf,unsigned int count, 1200c0d06caSMauro Carvalho Chehab const char *keyword) 1210c0d06caSMauro Carvalho Chehab { 1220c0d06caSMauro Carvalho Chehab unsigned int kl; 1230c0d06caSMauro Carvalho Chehab if (!keyword) return 0; 1240c0d06caSMauro Carvalho Chehab kl = strlen(keyword); 1250c0d06caSMauro Carvalho Chehab if (kl != count) return 0; 1260c0d06caSMauro Carvalho Chehab return !memcmp(buf,keyword,kl); 1270c0d06caSMauro Carvalho Chehab } 1280c0d06caSMauro Carvalho Chehab 1290c0d06caSMauro Carvalho Chehab 1300c0d06caSMauro Carvalho Chehab int pvr2_debugifc_print_info(struct pvr2_hdw *hdw,char *buf,unsigned int acnt) 1310c0d06caSMauro Carvalho Chehab { 1320c0d06caSMauro Carvalho Chehab int bcnt = 0; 1330c0d06caSMauro Carvalho Chehab int ccnt; 1340c0d06caSMauro Carvalho Chehab ccnt = scnprintf(buf, acnt, "Driver hardware description: %s\n", 1350c0d06caSMauro Carvalho Chehab pvr2_hdw_get_desc(hdw)); 1360c0d06caSMauro Carvalho Chehab bcnt += ccnt; acnt -= ccnt; buf += ccnt; 1370c0d06caSMauro Carvalho Chehab ccnt = scnprintf(buf,acnt,"Driver state info:\n"); 1380c0d06caSMauro Carvalho Chehab bcnt += ccnt; acnt -= ccnt; buf += ccnt; 1390c0d06caSMauro Carvalho Chehab ccnt = pvr2_hdw_state_report(hdw,buf,acnt); 1400c0d06caSMauro Carvalho Chehab bcnt += ccnt; acnt -= ccnt; buf += ccnt; 1410c0d06caSMauro Carvalho Chehab 1420c0d06caSMauro Carvalho Chehab return bcnt; 1430c0d06caSMauro Carvalho Chehab } 1440c0d06caSMauro Carvalho Chehab 1450c0d06caSMauro Carvalho Chehab 1460c0d06caSMauro Carvalho Chehab int pvr2_debugifc_print_status(struct pvr2_hdw *hdw, 1470c0d06caSMauro Carvalho Chehab char *buf,unsigned int acnt) 1480c0d06caSMauro Carvalho Chehab { 1490c0d06caSMauro Carvalho Chehab int bcnt = 0; 1500c0d06caSMauro Carvalho Chehab int ccnt; 1510c0d06caSMauro Carvalho Chehab int ret; 1520c0d06caSMauro Carvalho Chehab u32 gpio_dir,gpio_in,gpio_out; 1530c0d06caSMauro Carvalho Chehab struct pvr2_stream_stats stats; 1540c0d06caSMauro Carvalho Chehab struct pvr2_stream *sp; 1550c0d06caSMauro Carvalho Chehab 1560c0d06caSMauro Carvalho Chehab ret = pvr2_hdw_is_hsm(hdw); 1570c0d06caSMauro Carvalho Chehab ccnt = scnprintf(buf,acnt,"USB link speed: %s\n", 1580c0d06caSMauro Carvalho Chehab (ret < 0 ? "FAIL" : (ret ? "high" : "full"))); 1590c0d06caSMauro Carvalho Chehab bcnt += ccnt; acnt -= ccnt; buf += ccnt; 1600c0d06caSMauro Carvalho Chehab 1610c0d06caSMauro Carvalho Chehab gpio_dir = 0; gpio_in = 0; gpio_out = 0; 1620c0d06caSMauro Carvalho Chehab pvr2_hdw_gpio_get_dir(hdw,&gpio_dir); 1630c0d06caSMauro Carvalho Chehab pvr2_hdw_gpio_get_out(hdw,&gpio_out); 1640c0d06caSMauro Carvalho Chehab pvr2_hdw_gpio_get_in(hdw,&gpio_in); 1650c0d06caSMauro Carvalho Chehab ccnt = scnprintf(buf,acnt,"GPIO state: dir=0x%x in=0x%x out=0x%x\n", 1660c0d06caSMauro Carvalho Chehab gpio_dir,gpio_in,gpio_out); 1670c0d06caSMauro Carvalho Chehab bcnt += ccnt; acnt -= ccnt; buf += ccnt; 1680c0d06caSMauro Carvalho Chehab 1690c0d06caSMauro Carvalho Chehab ccnt = scnprintf(buf,acnt,"Streaming is %s\n", 1700c0d06caSMauro Carvalho Chehab pvr2_hdw_get_streaming(hdw) ? "on" : "off"); 1710c0d06caSMauro Carvalho Chehab bcnt += ccnt; acnt -= ccnt; buf += ccnt; 1720c0d06caSMauro Carvalho Chehab 1730c0d06caSMauro Carvalho Chehab 1740c0d06caSMauro Carvalho Chehab sp = pvr2_hdw_get_video_stream(hdw); 1750c0d06caSMauro Carvalho Chehab if (sp) { 1760c0d06caSMauro Carvalho Chehab pvr2_stream_get_stats(sp, &stats, 0); 1770c0d06caSMauro Carvalho Chehab ccnt = scnprintf( 1780c0d06caSMauro Carvalho Chehab buf,acnt, 17996292c89SMauro Carvalho Chehab "Bytes streamed=%u URBs: queued=%u idle=%u ready=%u processed=%u failed=%u\n", 1800c0d06caSMauro Carvalho Chehab stats.bytes_processed, 1810c0d06caSMauro Carvalho Chehab stats.buffers_in_queue, 1820c0d06caSMauro Carvalho Chehab stats.buffers_in_idle, 1830c0d06caSMauro Carvalho Chehab stats.buffers_in_ready, 1840c0d06caSMauro Carvalho Chehab stats.buffers_processed, 1850c0d06caSMauro Carvalho Chehab stats.buffers_failed); 1860c0d06caSMauro Carvalho Chehab bcnt += ccnt; acnt -= ccnt; buf += ccnt; 1870c0d06caSMauro Carvalho Chehab } 1880c0d06caSMauro Carvalho Chehab 1890c0d06caSMauro Carvalho Chehab return bcnt; 1900c0d06caSMauro Carvalho Chehab } 1910c0d06caSMauro Carvalho Chehab 1920c0d06caSMauro Carvalho Chehab 1930c0d06caSMauro Carvalho Chehab static int pvr2_debugifc_do1cmd(struct pvr2_hdw *hdw,const char *buf, 1940c0d06caSMauro Carvalho Chehab unsigned int count) 1950c0d06caSMauro Carvalho Chehab { 1960c0d06caSMauro Carvalho Chehab const char *wptr; 1970c0d06caSMauro Carvalho Chehab unsigned int wlen; 1980c0d06caSMauro Carvalho Chehab unsigned int scnt; 1990c0d06caSMauro Carvalho Chehab 2000c0d06caSMauro Carvalho Chehab scnt = debugifc_isolate_word(buf,count,&wptr,&wlen); 2010c0d06caSMauro Carvalho Chehab if (!scnt) return 0; 2020c0d06caSMauro Carvalho Chehab count -= scnt; buf += scnt; 2030c0d06caSMauro Carvalho Chehab if (!wptr) return 0; 2040c0d06caSMauro Carvalho Chehab 2050c0d06caSMauro Carvalho Chehab pvr2_trace(PVR2_TRACE_DEBUGIFC,"debugifc cmd: \"%.*s\"",wlen,wptr); 2060c0d06caSMauro Carvalho Chehab if (debugifc_match_keyword(wptr,wlen,"reset")) { 2070c0d06caSMauro Carvalho Chehab scnt = debugifc_isolate_word(buf,count,&wptr,&wlen); 2080c0d06caSMauro Carvalho Chehab if (!scnt) return -EINVAL; 2090c0d06caSMauro Carvalho Chehab count -= scnt; buf += scnt; 2100c0d06caSMauro Carvalho Chehab if (!wptr) return -EINVAL; 2110c0d06caSMauro Carvalho Chehab if (debugifc_match_keyword(wptr,wlen,"cpu")) { 2120c0d06caSMauro Carvalho Chehab pvr2_hdw_cpureset_assert(hdw,!0); 2130c0d06caSMauro Carvalho Chehab pvr2_hdw_cpureset_assert(hdw,0); 2140c0d06caSMauro Carvalho Chehab return 0; 2150c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"bus")) { 2160c0d06caSMauro Carvalho Chehab pvr2_hdw_device_reset(hdw); 2170c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"soft")) { 2180c0d06caSMauro Carvalho Chehab return pvr2_hdw_cmd_powerup(hdw); 2190c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"deep")) { 2200c0d06caSMauro Carvalho Chehab return pvr2_hdw_cmd_deep_reset(hdw); 2210c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"firmware")) { 2220c0d06caSMauro Carvalho Chehab return pvr2_upload_firmware2(hdw); 2230c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"decoder")) { 2240c0d06caSMauro Carvalho Chehab return pvr2_hdw_cmd_decoder_reset(hdw); 2250c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"worker")) { 2260c0d06caSMauro Carvalho Chehab return pvr2_hdw_untrip(hdw); 2270c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"usbstats")) { 2280c0d06caSMauro Carvalho Chehab pvr2_stream_get_stats(pvr2_hdw_get_video_stream(hdw), 2290c0d06caSMauro Carvalho Chehab NULL, !0); 2300c0d06caSMauro Carvalho Chehab return 0; 2310c0d06caSMauro Carvalho Chehab } 2320c0d06caSMauro Carvalho Chehab return -EINVAL; 2330c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"cpufw")) { 2340c0d06caSMauro Carvalho Chehab scnt = debugifc_isolate_word(buf,count,&wptr,&wlen); 2350c0d06caSMauro Carvalho Chehab if (!scnt) return -EINVAL; 2360c0d06caSMauro Carvalho Chehab count -= scnt; buf += scnt; 2370c0d06caSMauro Carvalho Chehab if (!wptr) return -EINVAL; 2380c0d06caSMauro Carvalho Chehab if (debugifc_match_keyword(wptr,wlen,"fetch")) { 2390c0d06caSMauro Carvalho Chehab scnt = debugifc_isolate_word(buf,count,&wptr,&wlen); 2400c0d06caSMauro Carvalho Chehab if (scnt && wptr) { 2410c0d06caSMauro Carvalho Chehab count -= scnt; buf += scnt; 2420c0d06caSMauro Carvalho Chehab if (debugifc_match_keyword(wptr, wlen, 2430c0d06caSMauro Carvalho Chehab "prom")) { 2440c0d06caSMauro Carvalho Chehab pvr2_hdw_cpufw_set_enabled(hdw, 2, !0); 2450c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr, wlen, 2460c0d06caSMauro Carvalho Chehab "ram8k")) { 2470c0d06caSMauro Carvalho Chehab pvr2_hdw_cpufw_set_enabled(hdw, 0, !0); 2480c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr, wlen, 2490c0d06caSMauro Carvalho Chehab "ram16k")) { 2500c0d06caSMauro Carvalho Chehab pvr2_hdw_cpufw_set_enabled(hdw, 1, !0); 2510c0d06caSMauro Carvalho Chehab } else { 2520c0d06caSMauro Carvalho Chehab return -EINVAL; 2530c0d06caSMauro Carvalho Chehab } 2540c0d06caSMauro Carvalho Chehab } 2550c0d06caSMauro Carvalho Chehab pvr2_hdw_cpufw_set_enabled(hdw,0,!0); 2560c0d06caSMauro Carvalho Chehab return 0; 2570c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"done")) { 2580c0d06caSMauro Carvalho Chehab pvr2_hdw_cpufw_set_enabled(hdw,0,0); 2590c0d06caSMauro Carvalho Chehab return 0; 2600c0d06caSMauro Carvalho Chehab } else { 2610c0d06caSMauro Carvalho Chehab return -EINVAL; 2620c0d06caSMauro Carvalho Chehab } 2630c0d06caSMauro Carvalho Chehab } else if (debugifc_match_keyword(wptr,wlen,"gpio")) { 2640c0d06caSMauro Carvalho Chehab int dir_fl = 0; 2650c0d06caSMauro Carvalho Chehab int ret; 2660c0d06caSMauro Carvalho Chehab u32 msk,val; 2670c0d06caSMauro Carvalho Chehab scnt = debugifc_isolate_word(buf,count,&wptr,&wlen); 2680c0d06caSMauro Carvalho Chehab if (!scnt) return -EINVAL; 2690c0d06caSMauro Carvalho Chehab count -= scnt; buf += scnt; 2700c0d06caSMauro Carvalho Chehab if (!wptr) return -EINVAL; 2710c0d06caSMauro Carvalho Chehab if (debugifc_match_keyword(wptr,wlen,"dir")) { 2720c0d06caSMauro Carvalho Chehab dir_fl = !0; 2730c0d06caSMauro Carvalho Chehab } else if (!debugifc_match_keyword(wptr,wlen,"out")) { 2740c0d06caSMauro Carvalho Chehab return -EINVAL; 2750c0d06caSMauro Carvalho Chehab } 2760c0d06caSMauro Carvalho Chehab scnt = debugifc_isolate_word(buf,count,&wptr,&wlen); 2770c0d06caSMauro Carvalho Chehab if (!scnt) return -EINVAL; 2780c0d06caSMauro Carvalho Chehab count -= scnt; buf += scnt; 2790c0d06caSMauro Carvalho Chehab if (!wptr) return -EINVAL; 2800c0d06caSMauro Carvalho Chehab ret = debugifc_parse_unsigned_number(wptr,wlen,&msk); 2810c0d06caSMauro Carvalho Chehab if (ret) return ret; 2820c0d06caSMauro Carvalho Chehab scnt = debugifc_isolate_word(buf,count,&wptr,&wlen); 2830c0d06caSMauro Carvalho Chehab if (wptr) { 2840c0d06caSMauro Carvalho Chehab ret = debugifc_parse_unsigned_number(wptr,wlen,&val); 2850c0d06caSMauro Carvalho Chehab if (ret) return ret; 2860c0d06caSMauro Carvalho Chehab } else { 2870c0d06caSMauro Carvalho Chehab val = msk; 2880c0d06caSMauro Carvalho Chehab msk = 0xffffffff; 2890c0d06caSMauro Carvalho Chehab } 2900c0d06caSMauro Carvalho Chehab if (dir_fl) { 2910c0d06caSMauro Carvalho Chehab ret = pvr2_hdw_gpio_chg_dir(hdw,msk,val); 2920c0d06caSMauro Carvalho Chehab } else { 2930c0d06caSMauro Carvalho Chehab ret = pvr2_hdw_gpio_chg_out(hdw,msk,val); 2940c0d06caSMauro Carvalho Chehab } 2950c0d06caSMauro Carvalho Chehab return ret; 2960c0d06caSMauro Carvalho Chehab } 2970c0d06caSMauro Carvalho Chehab pvr2_trace(PVR2_TRACE_DEBUGIFC, 2980c0d06caSMauro Carvalho Chehab "debugifc failed to recognize cmd: \"%.*s\"",wlen,wptr); 2990c0d06caSMauro Carvalho Chehab return -EINVAL; 3000c0d06caSMauro Carvalho Chehab } 3010c0d06caSMauro Carvalho Chehab 3020c0d06caSMauro Carvalho Chehab 3030c0d06caSMauro Carvalho Chehab int pvr2_debugifc_docmd(struct pvr2_hdw *hdw,const char *buf, 3040c0d06caSMauro Carvalho Chehab unsigned int count) 3050c0d06caSMauro Carvalho Chehab { 3060c0d06caSMauro Carvalho Chehab unsigned int bcnt = 0; 3070c0d06caSMauro Carvalho Chehab int ret; 3080c0d06caSMauro Carvalho Chehab 3090c0d06caSMauro Carvalho Chehab while (count) { 3100c0d06caSMauro Carvalho Chehab for (bcnt = 0; bcnt < count; bcnt++) { 3110c0d06caSMauro Carvalho Chehab if (buf[bcnt] == '\n') break; 3120c0d06caSMauro Carvalho Chehab } 3130c0d06caSMauro Carvalho Chehab 3140c0d06caSMauro Carvalho Chehab ret = pvr2_debugifc_do1cmd(hdw,buf,bcnt); 3150c0d06caSMauro Carvalho Chehab if (ret < 0) return ret; 3160c0d06caSMauro Carvalho Chehab if (bcnt < count) bcnt++; 3170c0d06caSMauro Carvalho Chehab buf += bcnt; 3180c0d06caSMauro Carvalho Chehab count -= bcnt; 3190c0d06caSMauro Carvalho Chehab } 3200c0d06caSMauro Carvalho Chehab 3210c0d06caSMauro Carvalho Chehab return 0; 3220c0d06caSMauro Carvalho Chehab } 323